基本上,Android 的想法是让你无法做你想做的事情,因为我们作为开发人员试图耗尽电池。
您需要了解限制的演变情况:
版本 6 - 打瞌睡:
https://developer.android.com/training/monitoring-device-state/doze-standby https://developer.android.com/training/monitoring-device-state/doze-standby
https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-power https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-power
版本 7 另一种 Doze 状态,具有更多限制:https://developer.android.com/about/versions/nougat/android-7.0-changes#perf https://developer.android.com/about/versions/nougat/android-7.0-changes#perf
广播限制:https://developer.android.com/guide/components/broadcasts https://developer.android.com/guide/components/broadcasts
https://developer.android.com/about/versions/nougat/android-7.0-changes#bg-opt https://developer.android.com/about/versions/nougat/android-7.0-changes#bg-opt
版本 8.0 后台执行限制:https://developer.android.com/about/versions/oreo/background#services https://developer.android.com/about/versions/oreo/background#services
版本 9 备用存储桶 - 根据应用程序的使用方式,您可以使用不同的资源 - 例如唤醒应用程序的时间、使用网络的时间等
https://developer.android.com/about/versions/pie/power#buckets https://developer.android.com/about/versions/pie/power#buckets
https://developer.android.com/about/versions/12/behavior-changes-all#restrictive-app-standby-bucket https://developer.android.com/about/versions/12/behavior-changes-all#restrictive-app-standby-bucket
https://developer.android.com/topic/performance/appstandby https://developer.android.com/topic/performance/appstandby
省电改进:
https://developer.android.com/about/versions/pie/power#battery-saver https://developer.android.com/about/versions/pie/power#battery-saver
电源管理限制- 真的很重要。https://developer.android.com/topic/performance/power/power-details https://developer.android.com/topic/performance/power/power-details
版本 11 和 12 应用程序休眠
https://developer.android.com/topic/performance/app-hibernation https://developer.android.com/topic/performance/app-hibernation
长话短说——您需要防止所有这些限制损害您的工作。但您需要遵守,因为这对用户更好。
但没有一个 API 只会说:“去他妈的所有这些限制,做开发者想做的任何事情。”
如果你需要准确的时间- 你需要警报管理器。
如果您不知道何时需要完成工作并依赖外部 - 推送通知,则可以将工作转移到 WorkManager。
如果您需要对时间要求不高的定期工作 - 您可能不会使用 AlarmMangaer 并确保工作完成,但您无法确定何时完成,因为有很多限制,并且优先考虑的是节省资源。
此外,您还可以要求用户免于电池优化:
https://developer.android.com/training/monitoring-device-state/doze-standby#support_for_other_use_cases https://developer.android.com/training/monitoring-device-state/doze-standby#support_for_other_use_cases
如果你想知道为什么工作没有执行,你需要检查 JS 转储并查看不满足哪些限制:
https://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging#use-alb-shell0dumpsys-jobscheduler https://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging#use-alb-shell0dumpsys-jobscheduler