我想显示特定时间的通知。所以我创建了这个函数:
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(...)
,但结果相同。
答案 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的答案非常相似。