实际上,我正在开发一个应用程序,在未来的5天内发布一个通知。
使用AlarmManager,我向我的接收类发送一个PendingIntent。在我强行关闭我的应用程序之前,一切都很好。在这种情况下,通知不会出现。
那么,我的问题是:这个PendingIntent发生了什么变化,它被发射了,但没有达到目标?当我的应用程序最终重新启动时,我能检查一下没有达到目标的PendingIntents吗?
编辑1:
以下是我的广播接收机的重要组成部分:
override fun onReceive(context: Context?, intent: Intent?) {
if (context != null && intent?.action != null) {
when (intent.action) {
INTENT_ACTION_BOOT_COMPLETED -> handleDeviceBoot()
INTENT_ACTION_REMINDER -> handleReminder(context, intent.getLongExtra(EXTRA_ITEM_ID, -1))
}
}
}
private suspend fun schedule(context: Context, itemId: Long, fireDate: LocalDateTime) = withContext(Dispatchers.IO) {
AlarmManagerCompat.setAndAllowWhileIdle(
getAlarmManager(context),
AlarmManager.RTC,
fireDate.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(),
makePendingIntent(context, itemId)
)
with(AppDatabase.get(context).reminderDao()) {
val oldReminder = getItemReminder(itemId)
if (oldReminder == null) {
insert(Reminder(itemId = itemId, fireDate = fireDate))
} else {
update(Reminder(id = oldReminder.id, itemId = itemId, fireDate = fireDate))
}
}
}
private suspend fun cancel(context: Context, itemId: Long) = withContext(Dispatchers.IO) {
val reminderDao = AppDatabase.get(context).reminderDao()
val reminder = reminderDao.getItemReminder(itemId)
reminder?.let {
getAlarmManager(context).cancel(makePendingIntent(context, itemId))
reminderDao.delete(it)
}
}
private fun getAlarmManager(context: Context) = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
private fun makePendingIntent(context: Context, itemId: Long): PendingIntent {
val alarmIntent = Intent(context, ReminderManager::class.java).apply {
action = INTENT_ACTION_REMINDER
putExtra(EXTRA_ITEM_ID, itemId)
}
return PendingIntent.getBroadcast(context, itemId.toInt(), alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)
}
发布于 2019-04-11 19:32:10
答案很短:在应用程序强制停止时,活动PendingIntents被取消。
发布于 2019-02-22 07:13:21
如官方Android文档中所定义的
PendingIntent本身只是对系统维护的令牌的引用,描述了用于检索它的原始数据。这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身也将从其他已给它的进程中保持可用。如果创建应用程序稍后重新检索相同类型的PendingIntent (相同的操作、相同的意图操作、数据、类别和组件以及相同的标志),则如果该操作仍然有效,它将接收表示相同令牌的PendingIntent,因此可以调用cancel()来删除它。
重新检查您的代码,以检查是否有任何其他原因会导致此问题。
发布于 2019-02-27 10:25:14
当您“强制关闭”应用程序时,应用程序将被设置为“停止状态”。在“停止状态”中,在用户手动重新启动应用程序之前,Android不会自动启动应用程序。这意味着,如果您“强制关闭”您的应用程序,您的应用程序将不会收到任何广播Intent
,直到它是手动重新启动的用户。
我希望(虽然我自己还没有试过),如果你在X时间安排了一个闹钟,在X时间之前你“强行关闭”了应用程序,当时间X发生时,警报管理器会尝试发送PendingIntent
,但是安卓会拒绝实际执行BroadcastReceiver
,因为应用程序处于“停止状态”。在这种情况下,我认为触发器丢失了。Android不会重试或重新安排它。
基本上,当用户“强行关闭”是一个应用程序时,他告诉Android,他不希望该应用程序继续运行,包括该应用程序可能拥有或希望在未来启动的任何后台进程。
https://stackoverflow.com/questions/54821741
复制相似问题