java - 无论手机处于何种状态,如何确保我的应用程序继续运行?
问题描述
我正在尝试制作一个应用程序,其中包含一些计划任务和一个辅助服务记录信息。
我现在看到的问题是我用来在事件发生时WorkManager
运行的任务Workers
,有时它们不会在我安排它们的确切时间运行。我知道当手机正在使用资源时会发生这种情况,因此 Android 会将我的任务推回它可以自由执行的时间,但我将如何做到这一点,以便它始终在我告诉它的时间运行?
我研究过它,发现AlarmManager
该setExactAndAllowWhileIdle
属性可能有用,但我在文档中读到它可以运行多少次是有限制的。我也研究了Quartz-Scheduler,但我不知道这是否适用于这些情况。
长时间不使用我的应用程序时,无障碍服务也停止工作,我想这是同样的问题(虽然不完全确定)。
为我的应用禁用“电池优化”会有助于解决所有这些问题吗?或者什么是一个好的方法?
解决方案
- 您需要它有多“精确”?如果它必须非常准确,也许您应该考虑推送通知。请记住,如果通知的优先级不高,您的工作将由 WorkManager 再次处理。但是对于高优先级,用户必须与通知交互,否则通知将被停止。这意味着您在只需要使用 WorkManager 的地方使用推送。
- 请记住,对于任何供应商,情况都会有所不同。没有确切的答案。
- WorkManager 并不是比其他选项提供更少的东西。最后,你有一些来自 Android 的限制。如果您使用 JobScheduler 和 AlarmManager,您需要自己处理它们。
- WorkManager 通过在下面使用 JobScheduler 和 AlarmManager 来处理工作,但很酷的是它有自己的数据库,因此您不会在应用程序重启时丢失工作。所以基本上它是更多而不是更少。
- 根据我自己的经验,我知道在某些中文设备上(忘记了名字)——WorkManager 和 JobScheduler 的行为相同,但在关闭电池优化的情况下——WorkManager 的行为更好。长话短说——你做得越多越好。您将处理更多供应商。
- 是的 - 你应该检查电源桶信息。如果您处于较低功率的桶中,并且这取决于用户与您的应用程序交互的程度 - 您将被执行的次数越少。电源优化 - 关闭 - 将为您提供帮助。 https://developer.android.com/topic/performance/power/power-details
- 尝试检查 JobScheduler 转储(因为您的工作实际上是下面的 Job)。它会告诉你你的工作缺少什么。也许你被执行了太多次——你会看到 QUOTA 不满意。如果您正在拨打网络电话,那么您每 24 小时都有一定的时间。如果您使用过它,您会看到 CONNECTIVITY 不满意。使用:adb shell dumpsys jobscheduler 更多信息:https ://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging
- 我假设您熟悉 flex 间隔: https ://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work#flexible_run_intervals
还有一个网站总结了不同供应商的工作方式:
推荐阅读
- gitlab - 在我自己的 repo 中编写新代码时,如何使用另一个镜像 repo 使我的项目的当前发布版本保持最新
- git - Git将master复制到远程的新分支并从本地推送到新分支
- singleton - Laravel 单例总是提供新的实例
- c# - 我可以在 WebhookResponse 中传递身份验证令牌参数并在 webhook 标头中使用令牌吗?
- angular - 如何通过使用角度中的复选框并在按钮单击中键入脚本来从网格中获取选定的项目
- environment-variables - 如何访问 Nuxt 插件中的 .env 变量?
- r - 在 R 中编辑 .clog 文件
- python - 动态定义函数在类对象中不起作用?
- r - 许多二进制列:需要使用第二个数据帧中的分组信息减少到更少的二进制列
- jquery - WordPress/Elementor 实现类似 React 的 Framer's Motion 的页面过渡效果