android - 如何让 Android ForegroundService 在较新版本的 Android 中无限期运行?
问题描述
我从一所计算机科学学院毕业,作为一个文凭项目,我想构建一个 Android 应用程序来监控用户的电池,然后可以使用 root 来禁用手机充电。第一步是监控用户的电池和使用模式,并为他们提供一些统计数据。
为了监控电池,我使用前台服务,通过广播接收器不时查询电池状态以获取ACTION_BATTERY_CHANGED
事件。但是我在保持前台服务存活时遇到了问题。它持续工作 10-15 分钟,但最终被系统杀死(我想可能是因为事件很少发生)。我还尝试使用协同程序来延迟查询并每 1 分钟手动执行一次,然后更频繁地执行一次,例如 30 秒,但我的服务最终仍会被终止,并且即使启动时也不会在不久的将来再次启动START_STICKY
. 我还尝试通过 AlarmManager 设置警报以不时重新启动我的服务,但我仍然无法获得一致的电池数据模式,以便能够为我的项目核心分析和构建估计算法。
我在 OnePlus 5T 上运行 Android 9 作为我的测试设备,并且很难保持前台服务处于活动状态。但我观察到有一些应用程序Mi Fit
,Mi Band Tools
甚至这个电池应用程序,当它们停止时设法以某种方式重新启动它们的前台服务。我可以看到我的屏幕亮起并显示其中一个应用程序已停止但是当我打开通知时我可以看到该应用程序的前台通知仍然存在,所以它可能立即重新启动(但是当同样的事情发生在我的应用程序中,我的前台通知不再存在)。
我还尝试OnDestroy
在我的服务中覆盖并从那里重新启动它,但似乎OnDestroy
没有调用该方法,系统可能只是在需要更多内存时终止了该进程。我也不能使用BroadcastReceiver
在 s 中注册的 s,Manifest
因为它们在 Android 8+ 中不再起作用(大多数教程都建议这样做)。
我阅读了有关该主题的所有内容,但没有任何效果。最好的方法是通过设置警报,AlarmManager
但即使在几个小时后也停止了工作,但不知何故其他应用程序继续工作,我很想知道我应该如何在较新的 Android 版本(最好是 Android 8 及以上)中执行此操作。
谢谢!
解决方案
通过使用 Workmanager 启动 PeriodicWork 并检查前台服务是否正在运行,如果没有在doWork()
方法内启动服务
推荐阅读
- javascript - 获取变量中的字符串以在 Javascript 中创建动态链接
- javascript - 在此处地图上隐藏/显示地图标记
- java - 在 Java 中创建注册表/数据库列表
- python - 加载所有相关对象而不使用命名表
- sql-server - SQL Server:自联接查询;仅选择与名字匹配的记录,而没有 where 语句
- ios - 在 Swift 中隐藏 TabbedBarController 上的后退按钮
- sql - 如何翻译 SQL 语句以在 sqlx API 调用中使用?
- logging - NLog Core 2.0 自动记录
- c# - 如果 linq 查询中没有数据,我如何默认返回 0 作为十进制值?
- android - 为什么在 Volley 响应结果循环下 arrayList 总是为空?