android - 在提醒应用程序中安排警报时如何替换已弃用的 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 时,它被禁止并且没有任何反应。
解决方案
这似乎是一个常见的用例,我也在努力解决。我发现的唯一有希望的答案是 ViciDroid 在https://www.reddit.com/r/androiddev/comments/71arjj/im_confused_about_android_o_and_task_execution/的评论中, 基本上 ViciDroid 建议:“自己做唤醒锁并从常规扩展广播接收器。Google 文档有 PowerManager 的示例代码。这与在 WakefulBroadcastReceiver 出现之前您必须执行此操作的方式相同。
由于隐含的广播禁令,还要明确注册您的广播。”
我还没有尝试过,但听起来很有希望 - 希望很快会尝试并报告。
推荐阅读
- webpack - 如何在插件中定义特定版本的 Office.JS
- python - Python scipy solve_ivp / odeint:打印和绘制时间/解决方案相关参数
- python - 如何获取TensorFlow模型中输出节点的名称
- json - 根据属性反序列化两个不同的对象
- python - 从包含 dict 的 pandas 列中提取有用信息
- amazon-web-services - EC2 - 添加第二个接口和 pPrivat IP 导致没有链接
- javascript - WebGL 警告:texImage:跨域元素需要 CORS
- c# - 尝试使用数组输入 10 个数字,然后在每次输出后将它们写出来
- c# - NuGet 对新下载的包返回“包完整性检查”
- javascript - 无法在 Dynatrace 中执行 Javascript 正则表达式