Отображать уведомления только один раз с Alarmmanager (Android Studio) - PullRequest
0 голосов
/ 07 июля 2019

Я хочу показать уведомление в определенное время.Поэтому я создал эту функцию:

fun specificTime() {
    val _intent = Intent(this, AlarmBroadcastReceiver::class.java)
    val pendingIntent = PendingIntent.getBroadcast(this, 0, _intent, 0)
    val alarmManager = this.getSystemService(Context.ALARM_SERVICE) as AlarmManager
    alarmManager.cancel(pendingIntent)
    val calendar = Calendar.getInstance()
    calendar.setTimeInMillis(System.currentTimeMillis())
    calendar.set(Calendar.HOUR_OF_DAY, 13)
    calendar.set(Calendar.MINUTE, 30)
    calendar.set(Calendar.SECOND, 0)
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent)
}

Работает отлично.Когда приходит время, приложение показывает уведомление и все хорошо.Проблема в том, что когда я позже снова открою приложение, он снова отобразит уведомление.Я в замешательстве, потому что, как вы можете видеть из функции, я назначил уведомлению определенный час и время, поэтому я не понимаю, почему он снова показывает мне уведомление, даже когда я открываю приложение через 10 минут.Я добавил в Уведомление строку .setOnlyAlertOnce(true), но результат тот же.

ОБНОВЛЕНИЕ (1)

Проблема в последней строке функции alarmManager.set(...).Документация гласит:

Если указанное время срабатывания истекло, сигнал тревоги будет немедленно активирован.

Я пытался заменить его на alarmManager.setExact(...), но результат был тот же.

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Мое решение:

val timeUntilAlert: Long
    if (System.currentTimeMillis() < calendar.getTimeInMillis()){
        timeUntilAlert = calendar.getTimeInMillis()
    } else{
        timeUntilAlert = calendar.getTimeInMillis() + 86400000
    }

alarmManager.set(AlarmManager.RTC_WAKEUP, timeUntilAlert, pendingIntent)

Благодаря этому чуваку здесь. Ответ от @Jimale Abdi очень похож.

0 голосов
/ 07 июля 2019

Этот метод ниже, работает нормально, попробуйте

public void notifyAlarm(){

    Intent Alarmintent = new Intent(this,NotificationReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,Alarmintent,PendingIntent.FLAG_UPDATE_CURRENT);

    //set up the alarm Manager
    AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY,21);
    calendar.set(Calendar.MINUTE,0);
    calendar.set(Calendar.SECOND,0);
    if (calendar.getTime().compareTo(new Date()) < 0) calendar.add(Calendar.DAY_OF_MONTH, 1);

    assert alarmManager != null;
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,pendingIntent);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...