使用Alarmmanager(Android Studio)仅显示一次通知

时间:2019-07-07 12:03:36

标签: android android-studio kotlin

我想显示特定时间的通知。所以我创建了这个函数:

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 :(得分:0)

下面的方法可以很好地尝试

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);

}

答案 1 :(得分:0)

我的解决方案:

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

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

在此感谢this dude。 @Jimale Abdi的答案非常相似。