ユーザーが特定の時間データベースにメモを追加するたびに通知をスケジュールしたい。 AlarmManager、BroadcastReceiverなどを使用して行う方法は複数ありますが、WorkManagerを使用してどのように実行できますか?
WorkManager
は、特定の時間に発生する必要がある作業には適していません。
特定の時間にコールバックを取得するには、AlarmManager
、具体的には AlarmManagerCompat.setExactAndAllowWhileIdle() を使用する必要があります。
あなたはworkmanagerの助けを借りて通知を表示することができます。 Workmangerは、特定の時間にタスクをスケジュールできるだけでなく、単一発生タスクまたは定期発生タスクのスケジュールにも使用できます。
OneTimeWorkRequest request= new OneTimeWorkRequest.Builder(CustomWorkerClass.class)
.setInitialDelay(delayedTime, TimeUnit.MILLISECONDS)
.addTag("TAG")
.build();
'delayedTime'->通知をトリガーする時間を計算します
Androidワーカーマネージャーに関する公式ドキュメントによると、「これらのAPIを使用すると、タスクを作成し、それをWorkManagerに渡して、即時または適切なタイミングで実行できます」。私のアプリでは、 20秒後にアクティブ化する作業:
// Schedule the time
val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
WorkManager.getInstance().enqueue(request)
ianhanniballake として
WorkManagerは、特定の時間に発生する必要がある作業には適していません。
ただし、これは、バッテリー最適化の状態に応じて、正確な時間の近い将来に設定できます。
回避策は次のようになります。
// Time to show notification at
LocalDateTime timeAt = LocalDate.now().atTime(20, 0);
LocalDateTime timeNow = LocalDateTime.now();
OneTimeWorkRequest.Builder workBuilder = new OneTimeWorkRequest.Builder(NotificationWorker.class);
// I just need to set an delay here
workBuilder.setInitialDelay(Duration.between(timeNow, timeAt));
// This is just to complete the example
WorkManager.getInstance().enqueueUniqueWork(UNIQUE_WORK_SHOW_NOTIFICATION,
ExistingWorkPolicy.REPLACE,
workBuilder.build());