根据 Android Oreo 之后的this thread, Google 引入了一些背景限制,因此无法始终在 Service 中运行背景,而不显示用户通知。
是否可以通过root特权来实现?
编辑:我看到人们投票结束我的问题,因为它看起来似乎太笼统了,但是我正在运行 LineageOS ,并且我想将我的应用作为系统服务运行如果可能的话,我认为这无需修改源代码就可以实现。例如,在安装操作系统时,我可以刷新GApp,但是它是可选的,并且它们似乎具有我在说的功能。我也不希望您为我做所有的研究,我愿意接受为我指明正确方向的答案。
答案 0 :(得分:3)
确实存在一个未记录的shell命令,可以通过将软件包添加到全局location_background_throttle_package_whitelist
中来将其列入白名单(我尚未测试):
settings put global location_background_throttle_package_whitelist "package1,package2,package3"
^这是针对location
服务的,但可能还有其他background_throttle
可用的设置:
settings list global | grep background_throttle
来源:XDA Developers。
此外,在source code中,我仅找到以下设置:
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS
Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS
documentation很清楚,某些服务已添加到临时白名单中。为了找出实际上将这些服务列入白名单的内容,必须进一步挖掘。这些后台服务限制实际上是在Context.java中描述的,而用@UnsupportedAppUsage
注释的方法是仅系统使用的方法。
Firebase WorkManager仍然是最佳的选择-底层的JobIntentService仍将作为常规后台服务运行N
或Lineage OS 14.1
是一种解决方法,几乎没有考虑过。
关于root
权限将提供超级权限的假设可能是一个误解。允许不受限制的位置访问仍然非常有限,甚至Google自己的服务也只是临时地列入白名单。排除在这些后台执行限制之外的唯一服务是使用C++
编写的Linux system services(在JVM之外运行)–而与使用{{ 1}}(它们在JVM中运行,并且都扩展了相同的受限制的Java
类)。
答案 1 :(得分:1)
我发现一种非常有效的技术是使用绑定服务。不需要用户通知,并且由于您从不调用startService(),因此它适用于Oreo及更高版本。也不需要root。绑定到将始终运行的服务的一个好地方是来自应用程序对象的onCreate()方法。只要您的应用程序运行,该服务就会运行。