首页 > 解决方案 > 无论手机处于何种状态,如何确保我的应用程序继续运行?

问题描述

我正在尝试制作一个应用程序,其中包含一些计划任务和一个辅助服务记录信息。

我现在看到的问题是我用来在事件发生时WorkManager运行的任务Workers,有时它们不会在我安排它们的确切时间运行。我知道当手机正在使用资源时会发生这种情况,因此 Android 会将我的任务推回它可以自由执行的时间,但我将如何做到这一点,以便它始终在我告诉它的时间运行?

我研究过它,发现AlarmManagersetExactAndAllowWhileIdle属性可能有用,但我在文档中读到它可以运行多少次是有限制的。我也研究了Quartz-Scheduler,但我不知道这是否适用于这些情况。

长时间不使用我的应用程序时,无障碍服务也停止工作,我想这是同样的问题(虽然不完全确定)。

为我的应用禁用“电池优化”会有助于解决所有这些问题吗?或者什么是一个好的方法?

标签: javaandroidquartz-schedulerandroid-workmanagerbatterymanager

解决方案


  1. 您需要它有多“精确”?如果它必须非常准确,也许您应该考虑推送通知。请记住,如果通知的优先级不高,您的工作将由 WorkManager 再次处理。但是对于高优先级,用户必须与通知交互,否则通知将被停止。这意味着您在只需要使用 WorkManager 的地方使用推送。
  2. 请记住,对于任何供应商,情况都会有所不同。没有确切的答案。
  3. WorkManager 并不是比其他选项提供更少的东西。最后,你有一些来自 Android 的限制。如果您使用 JobScheduler 和 AlarmManager,您需要自己处理它们。
  4. WorkManager 通过在下面使用 JobScheduler 和 AlarmManager 来处理工作,但很酷的是它有自己的数据库,因此您不会在应用程序重启时丢失工作。所以基本上它是更多而不是更少。
  5. 根据我自己的经验,我知道在某些中文设备上(忘记了名字)——WorkManager 和 JobScheduler 的行为相同,但在关闭电池优化的情况下——WorkManager 的行为更好。长话短说——你做得越多越好。您将处理更多供应商。
  6. 是的 - 你应该检查电源桶信息。如果您处于较低功率的桶中,并且这取决于用户与您的应用程序交互的程度 - 您将被执行的次数越少。电源优化 - 关闭 - 将为您提供帮助。 https://developer.android.com/topic/performance/power/power-details
  7. 尝试检查 JobScheduler 转储(因为您的工作实际上是下面的 Job)。它会告诉你你的工作缺少什么。也许你被执行了太多次——你会看到 QUOTA 不满意。如果您正在拨打网络电话,那么您每 24 小时都有一定的时间。如果您使用过它,您会看到 CONNECTIVITY 不满意。使用:adb shell dumpsys jobscheduler 更多信息:https ://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging
  8. 我假设您熟悉 flex 间隔: https ://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work#flexible_run_intervals

还有一个网站总结了不同供应商的工作方式

https://dontkillmyapp.com/


推荐阅读