web-dev-qa-db-ja.com

WorkManagerを使用して通知をスケジュールする方法

ユーザーが特定の時間データベースにメモを追加するたびに通知をスケジュールしたい。 AlarmManager、BroadcastReceiverなどを使用して行う方法は複数ありますが、WorkManagerを使用してどのように実行できますか?

10
Ankur Gupta

WorkManagerは、特定の時間に発生する必要がある作業には適していません。

特定の時間にコールバックを取得するには、AlarmManager、具体的には AlarmManagerCompat.setExactAndAllowWhileIdle() を使用する必要があります。

9
ianhanniballake

あなたはworkmanagerの助けを借りて通知を表示することができます。 Workmangerは、特定の時間にタスクをスケジュールできるだけでなく、単一発生タスクまたは定期発生タスクのスケジュールにも使用できます。

OneTimeWorkRequest request= new OneTimeWorkRequest.Builder(CustomWorkerClass.class)
.setInitialDelay(delayedTime, TimeUnit.MILLISECONDS)
.addTag("TAG")
.build();

'delayedTime'->通知をトリガーする時間を計算します

実装の詳細については ここをクリック 。ワークマネージャーの詳細については ここをクリック

4
Sadashiv

Androidワーカーマネージャーに関する公式ドキュメントによると、「これらのAPIを使用すると、タスクを作成し、それをWorkManagerに渡して、即時または適切なタイミングで実行できます」。私のアプリでは、 20秒後にアクティブ化する作業:

 // Schedule the time
 val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
    WorkManager.getInstance().enqueue(request)
2
Gerardo Suarez

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());
0
Rajarshi