AndroidAPIレベル30以上のバックグラウンドでGPS位置を取得するための最良の方法

Nov 30 2020

私のアプリケーションは、ユーザーの場所によって制限速度を決定し、制限速度を超えたかどうかをユーザーに通知します。Android APIレベル30以降以降、GoogleはIntentServiceを非推奨として定義し、WorkManagerまたはJobIntentServiceの使用を提案し、FirebaseJobDispatcherからWorkManagerに移行する必要があるとも述べています。この問題を解決するには、次の2つの方法があります。

  1. OneTimeWorkRequestを開始し、アプリケーションがバックグラウンドで実行されている間、このメソッドでこのメソッドを定期的に再起動するように指定します。
  2. 15分の最小許容間隔でPeriodicWorkRequestを実行します。このメソッドでは、最大約10分間実行されるJobIntentServiceメソッドを実行しますが、メソッドが実行されないか、完了する前にシステムによって破棄される可能性があります。

心配です:

  • 潜在的なメモリリーク。
  • フォアグラウンドからバックグラウンドに、またはその逆に移動するときのWorkManagerまたはJobIntentServiceの潜在的な問題
  • MVVMパターンを使用する機能

回答

5 NikolaDespotoski Dec 07 2020 at 23:42

2番目のオプションを使用することをお勧めします。これにより、の各再スケジュールの間隔が長くなりWorkerます。

あなたの懸念について:

  • リークの可能性があるのは、ロケーションコールバックの不正行為だけです。これは簡単に追跡できます。あまり心配する必要はありません。
  • スケジュールWorkerはデータベースに入れられ、アプリケーションとは独立して実行されます。つまり、アプリケーションのユーザーの可視性は影響しません。あなたのケースでは、私は、ユーザーがアプリケーションを再開したら、あなたのスケジュールされた作業をキャンセルしたいと推定、ということではあなたが割り当てることができると述べたtagWorkerしてパージスケジュールさや、進行中のユーザーには見えたら。
  • WorkerMVVMから分離し、ユースケース/インタラクターをワーカーに挿入し、ユースケースを実行/インタラクターにクエリを実行することを好みます。ステータスWorkerManagerをクエリするための優れたAPIを提供しますWorker。以前の実装と、API> = 30のWorker場合の共通点を記述する必要がある場合があります。ユースケースの異なる実行コンテナとして扱います。