夜間のデータベース更新をスケジュールします。そこで、新しいAndroid WorkManagerを使用します。私の理解では、一度スケジュールすると、アプリのライフサイクルとは無関係に常にバックグラウンドで実行されます。そうですか?私の最初のテストでは、アプリの実行中にのみ作業が実行されることが示されています。
val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.Java, 24, TimeUnit.HOURS)
.addTag("DATABASE_UPDATE_SERVICE")
.build()
WorkManager.getInstance().enqueue(locationWork)
WorkManagerbugtracker で報告されたさまざまな問題に基づいて、それらのドキュメントはWorkManagerそのようなエッジの場合。
特定のデバイスでは、アプリがタスクマネージャーからクリアされるとアプリが強制停止されるため、その部分が予想されます。 ... ソース
残念ながら、一部のデバイスは、強制停止としてRecentsメニューからアプリを強制終了することを実装しています。 Stock Androidはこれを行いません。アプリが強制停止されると、ジョブを実行したり、アラームやブロードキャストを受信したりできなくなります。残念ながら、アプリに対処することは不可能です。問題はOSにあり、回避策はありません。 ソース
私たちが遭遇した唯一の問題は、一部の中国のOEMがRecentsからのスワイプを強制停止として扱うケースです。その場合、WorkManagerは次回アプリが起動するときにすべての保留中のジョブを再スケジュールします。これがCDD違反であることを考えると、WorkManagerがクライアントライブラリを指定してできることはこれ以上ありません。 ソース
これに追加して、デバイスの製造元がアプリを強制停止するために在庫Androidを変更することを決定した場合、WorkManagerは動作を停止します(JobScheduler、アラーム、ブロードキャストレシーバーなど)。これを回避する方法はありません。一部のデバイスメーカーは残念ながらこれを行っているため、そのような場合、WorkManagerは次回アプリが起動するまで動作を停止します。 ソース
ストックAndroidを使用したPixel 2 XLでOneTimeWorkRequest
(制約なし)を徹底的にテストすると、動作は次のようになります。
dontkillmyapp.com でさまざまなOEM動作の完全なリストを見つけることができます。 Androidチームもこの問題を認め、Android QのCTSテストにこのテストを追加したようです。 source
私の理解では、一度スケジュールされると、アプリのライフサイクルとは無関係に常にバックグラウンドで実行されます。そうですか?
はい。 ドキュメント に基づく
アプリが強制終了された場合やデバイスが再起動された場合でも、タスクの実行は保証されます。
WorkManagerは、デバイスAPIレベルやアプリの状態などの要因に基づいて、タスクを実行する適切な方法を選択します。アプリの実行中にWorkManagerがタスクの1つを実行すると、WorkManagerはアプリのプロセス内の新しいスレッドでタスクを実行できます。アプリが実行されていない場合、WorkManagerはデバイスAPIレベルに応じて、バックグラウンドタスクをスケジュールする適切な方法を選択します。
WorkManagerは、APIレベルに応じてJobScheduler、Firebase JobDispatcher、またはAlarmManagerを使用する場合があります。 Dozeを反映し、Workを実行する前に他のすべての制約を考慮します。 Dozeモードでは、メンテナンスウィンドウを待機する可能性があるため、多少の遅延が予想されます。
注:
WorkManagerは、サーバーへのアプリデータのアップロードなど、アプリが終了してもシステムで実行されることを保証する必要があるタスクを対象としています。アプリプロセスが終了した場合に安全に終了できるインプロセスバックグラウンド作業を目的とするものではありません。そのような状況では、ThreadPoolsを使用することをお勧めします。
これはドキュメントが言っていることです:
注:WorkManagerは、サーバーへのアプリデータのアップロードなど、アプリが終了してもシステムで実行されることを保証する必要があるタスクを対象としています。アプリプロセスが終了した場合に安全に終了できるインプロセスバックグラウンド作業を意図していません。そのような状況では、ThreadPoolsを使用することをお勧めします。
ただし、何らかの条件が必要です。 その条件が満たされると、WorkManagerはタスクを実行します(これは重要です)。 「デバイスの充電中およびオンライン時のみ」などの条件
これをお読みください 慎重に 、WorkManagerは要求された間隔でタスクを実行しようとします、あなたが課す制約に従いますおよびその他の要件
ここで、タスクのスケジューリングにWorkManagerを使用する方法についての良いチュートリアルを見つけました: https://Android.jlelse.eu/how-scheduling-work-with-new-Android-jetpack-component-workmanager-852163f4825b =