Как запланировать уведомление на определенное время c? - PullRequest
0 голосов
/ 27 января 2020

Я могу установить уведомление на определенное время 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);
}
...