Я могу установить уведомление на определенное время c, используя AlarmManager, но тогда уведомления будут отменены, если телефон будет перезагружен. Кроме того, у меня есть проблема с AlarmManager, который я описал здесь .
Из-за вышеупомянутых проблем я решил установить уведомления OneTimeWorkRequest. OneTimeWorkRequest.Builder(class).setInitialDelay(long)
задерживает уведомление на миллисекунды, что не зависит от календарного времени устройства. Я пытался установить задержку на 5 минут и установить время устройства на 4 минуты вперед, и все же мне пришлось ждать 5 минут для уведомления вместо 1 минуты.
Это хорошая защита от мошенничества, если я планирую открыть окно lootbox. В моем случае я хочу запланировать уведомление о платеже, чтобы не показывать уведомление, например, в полночь, а не в 8:00, потому что пользователь переключил часовой пояс во время путешествия.
Есть ли способ установить OneTimeWorkRequest
время задержки основано на времени устройства?
NotificationScheduler.class
public void scheduleNotificationWorker(Bill bill){
if (calculateNotificationDelay(bill, 14, 1) > 0) {
Data inputData = new Data.Builder().putInt(UploadWorker.NOTIFICATION_ID, 1).build();
OneTimeWorkRequest notificationWork = new OneTimeWorkRequest.Builder(UploadWorker.class)
.setInitialDelay(calculateNotificationDelay(bill, 14, 2), TimeUnit.MILLISECONDS)
.setInputData(inputData)
.addTag("notification")
.build();
WorkManager.getInstance(context).enqueue(notificationWork);
}
else
Log.e("notification_error ", "Could't create notification because delay is negative. Probably bill is overdued.");
}
UploadWorker.class
@NonNull
@Override
public Result doWork() {
triggerNotification();
return Result.success();
}
private void triggerNotification(){
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "channel_id")
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle("My notificatiop")
.setContentText("Hello")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
Notification notification = builder.build();
final int id = getInputData().getInt(NOTIFICATION_ID, 0);
notificationManager.notify(id, notification);
}