首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果目标应用程序被强制关闭,PendingIntent会发生什么情况?

如果目标应用程序被强制关闭,PendingIntent会发生什么情况?
EN

Stack Overflow用户
提问于 2019-02-22 07:02:17
回答 3查看 1.4K关注 0票数 1

实际上,我正在开发一个应用程序,在未来的5天内发布一个通知。

使用AlarmManager,我向我的接收类发送一个PendingIntent。在我强行关闭我的应用程序之前,一切都很好。在这种情况下,通知不会出现。

那么,我的问题是:这个PendingIntent发生了什么变化,它被发射了,但没有达到目标?当我的应用程序最终重新启动时,我能检查一下没有达到目标的PendingIntents吗?

编辑1:

以下是我的广播接收机的重要组成部分:

代码语言:javascript
运行
复制
    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)
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-11 19:32:10

答案很短:在应用程序强制停止时,活动PendingIntents被取消。

票数 0
EN

Stack Overflow用户

发布于 2019-02-22 07:13:21

官方Android文档中所定义的

PendingIntent本身只是对系统维护的令牌的引用,描述了用于检索它的原始数据。这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身也将从其他已给它的进程中保持可用。如果创建应用程序稍后重新检索相同类型的PendingIntent (相同的操作、相同的意图操作、数据、类别和组件以及相同的标志),则如果该操作仍然有效,它将接收表示相同令牌的PendingIntent,因此可以调用cancel()来删除它。

重新检查您的代码,以检查是否有任何其他原因会导致此问题。

票数 0
EN

Stack Overflow用户

发布于 2019-02-27 10:25:14

当您“强制关闭”应用程序时,应用程序将被设置为“停止状态”。在“停止状态”中,在用户手动重新启动应用程序之前,Android不会自动启动应用程序。这意味着,如果您“强制关闭”您的应用程序,您的应用程序将不会收到任何广播Intent,直到它是手动重新启动的用户。

我希望(虽然我自己还没有试过),如果你在X时间安排了一个闹钟,在X时间之前你“强行关闭”了应用程序,当时间X发生时,警报管理器会尝试发送PendingIntent,但是安卓会拒绝实际执行BroadcastReceiver,因为应用程序处于“停止状态”。在这种情况下,我认为触发器丢失了。Android不会重试或重新安排它。

基本上,当用户“强行关闭”是一个应用程序时,他告诉Android,他不希望该应用程序继续运行,包括该应用程序可能拥有或希望在未来启动的任何后台进程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54821741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档