首页 > 解决方案 > 在提醒应用程序中安排警报时如何替换已弃用的 WakefulBroadcastReceiver?

问题描述

用例:我正在开发应用程序的一项功能,该功能允许用户在不同的时间/日期设置每周重复提醒,这将在执行时创建通知。不能错过此提醒,因此即使手机处于打盹模式,该应用也应唤醒手机。代码(基于我在下面指出的链接)是几年前完成的,一切正常,但是在针对较新的 API 时,我面临以下问题。

问题: WakefulBroadcastReceiver 已弃用

我尝试在此处搜索“[android] AlarmManager jobscheduler WakefulBroadcastReceiver”或在 Google 中搜索,但没有找到任何解决此问题的方法。

我看到数百个帖子讨论使用 AlarmManager 与 JobScheduler 的问题。但我很难找到真正的闹钟安排来实现提醒应用程序。

在这里这里这里这里看到的都是解决这个问题的非常古老的例子。但是都依赖于WakefulBroadcastReceiver。

我想像 JobScheduler 这样的替代方案需要替换 WakefulBroadcastReceiver,但也许我的用例不需要。

触发警报时,我会执行以下操作:

我可以这样做吗?

PendingIntent.getService(context, 30, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Intent 是一个简单的 IntentService(实际上是 WakefulBroadcastReceiver 调用的),它在 onHandleIntent 中完成所有工作。

或者我需要使用某种机制来保存 WAKE_LOCK?

更新1:我刚刚看到这篇文章。看起来 onHandleIntent 里面的东西可能没有足够的时间来执行。如何知道我的时间?

更新 2:我已经成功地将 AlarmManager 与 JobScheduler 配对,这样当用户的警报被触发时,一个作业被安排在后台检查数据库并显示通知,但是当针对 API 28 时,它被禁止并且没有任何反应。

标签: androidalarmmanagerandroid-pendingintentandroid-jobscheduler

解决方案


这似乎是一个常见的用例,我也在努力解决。我发现的唯一有希望的答案是 ViciDroid 在https://www.reddit.com/r/androiddev/comments/71arjj/im_confused_about_android_o_and_task_execution/的评论中, 基本上 ViciDroid 建议:“自己做唤醒锁并从常规扩展广播接收器。Google 文档有 PowerManager 的示例代码。这与在 WakefulBroadcastReceiver 出现之前您必须执行此操作的方式相同。

由于隐含的广播禁令,还要明确注册您的广播。”

我还没有尝试过,但听起来很有希望 - 希望很快会尝试并报告。


推荐阅读