【问题标题】:AlarmManager - tasks queue (PendingIntent queue)AlarmManager - 任务队列(PendingIntent 队列)
【发布时间】:2019-07-25 23:11:55
【问题描述】:

我正在使用AlarmManager 为我的小部件应用安排一些定期更新。我是这样安排的:

            context.getSystemService<AlarmManager>()!!
                    .setInexactRepeating(
                            AlarmManager.ELAPSED_REALTIME,
                            SystemClock.elapsedRealtime() + refreshInterval.intervalMillis,
                            refreshInterval.intervalMillis,
                            pendingIntent
                    )

我的待处理意图如下所示:

PendingIntent.getBroadcast(
                context,
                RQ_CODE_BASE + id,
                getStartIntent(context, appWidgetId),
                PendingIntent.FLAG_UPDATE_CURRENT
        )

如您所见,我正在使用非唤醒、不精确的重复警报。手机唤醒时一切似乎都运行良好,并且所有计划都在AlarmManager 触发警报后立即执行。

intervalMillis 等于 60k (1 分钟)。然后,当手机处于睡眠状态10 分钟,将其恢复“生活”后,我看到它不是只触发一次我的PendingIntent,而是执行PendingIntent 动作10 次一个又一个,像是在排队。我认为使用PendingIntent.FLAG_UPDATE_CURRENT 标志会导致取消之前的待处理警报操作,并在手机唤醒后安排新的警报操作,但不幸的是它不是那样工作的。

有什么方法可以实现期望的行为吗?我找不到任何AlarmMananger 方法可以让我查找特定待处理意图的任务队列。

如有任何帮助/建议,我将不胜感激。

【问题讨论】:

    标签: android alarmmanager android-pendingintent


    【解决方案1】:

    这是使用重复警报的缺点之一。我不会为此使用重复警报。如果您希望闹钟每 X 分钟响一次,那么从现在开始安排一个 X 分钟的闹钟。当警报触发时,做任何你想做的事,然后安排一个从现在开始 X 分钟后响起的警报。

    单个警报更容易预测,它们不会“排队”,如有必要,您可以使用精确警报。

    【讨论】:

    • 感谢您的建议 :) 我将尝试使用此解决方案。我也想知道使用JobScheduler API,但我相信这也会排队等待作业。