android - 在AlarmManager中重复警报中的不同间隔时间
问题描述
我正在查看setRepeating(@AlarmType int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
AlarmManager 的方法并想解决一个用例。
用例是我想设置具有不同intervalMillis
值的重复警报。就像我想在 2 小时、5 小时和第二天早上 9 点之后显示通知一样。或者我想在每个月的第一个日期做一些事情。
我有两个解决方案。要么我一次设置所有警报,要么在收到上一个警报时设置下一个警报(如果没有警报更像第二个用例)。问题是如果错过了触发警报,我将无法触发进一步的警报,整个链条都会中断。
如果我错过了 Android 是否为此提供了任何东西,或者 Android 不应该提供这种灵活性?
解决方案
有很多方法可以实现这一目标。无论如何,他们都需要一个共同的东西——数据库。这很容易理解,您需要数据库来存储以下信息:
- 警报是否有效(例如,或者应该关闭,例如在时钟应用程序中)
- 应该何时触发(例如,您重新启动设备并通过它启动服务
onBootReceived
,它需要检查它是否必须安排新的警报)
现在稍微谈谈PendingIntent
如果你安排一个相同的警报PendingIntent
- 我的意思是,意图,传入的数据,请求代码和操作是相同的,设置新警报后的每个旧警报都将被覆盖和取消。为避免这种情况,您必须将 uri 传递给您创建的每个警报。Uri
您可以简单地从数据库中获取。
示例:
您想安排PendingIntent
在下午 5 点、晚上 8 点和第二天上午 10 点触发的警报。假设您决定使用setRepeating()
代替设置警报 3 次setExactAndAllowWhileIdle()
。您必须做的是将这 3 个指定时间及其日历日传入数据库,将间隔设置为每 3 小时触发一次,每次警报触发时,它必须检查数据库是否是触发警报的时间。在这种行为中,您将产生更多的唤醒锁(每 3 小时产生一次),但您将确保您的警报将被触发。
可能我描述的不是很清楚,但希望你能理解。我还将提供一些链接,其中我描述了如何设置这些警报以及如何AlarmManagers
看到PendingIntent
s。:
推荐阅读
- excel - 自动过滤器 - 将运算符动态链接到单元格
- ansible-inventory - 如何让 awx 使用 azure_rm.yml 而不是 ini 版本?
- angular - ngb timepicker 覆盖字段集 css 样式
- python - 手动启动 DAG 会跳过下一次计划运行吗?
- html - 如何定位一个元素,就好像它是相对的但有属性就好像它是绝对的?
- python - 一旦设置为null,如何在Django模型中使用默认值?
- xamarin.forms - Xamarin ObservableCollection ListView 不刷新
- flutter - Flutter 将变量发送到其他类
- windows - 如何处理在批处理文件上运行命令时出现的错误
- javascript - 如何使用jsp或javascript在位于服务器上的浏览器中显示pdf