在初学Service时,发现使用外部Service,可以关闭另一个app已启动的Service,但却无法直接启动。一番学习之后,发现在Android 8.0(API 级别 26)对应用在后台运行时可以执行的操作施加了限制。
“每当应用在后台运行时,它都会消耗设备的一些有限资源,如 RAM。这可能会导致用户体验受损,尤其是在用户使用资源密集型应用(如玩游戏或观看视频)的情况下。”
这也就导致了无法直接在后台startService()。
解决方法
1. 在外部app的AndroidManifest.xml中插入语句
在启动外部Service的app中注册以下信息:
<queries>
<package android:name="com.xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxx" />
</queries>
在引号中键入被启动的Service所在的包名,如"com.example.anotherapp"。
注意不是在被启动的app中注册以上内容,比如在需要启动app1的Service,而这一启动的操作是在app2中完成的,则修改app2的AndroidManifest.xml。
初学者注意不要放在<application/>里面了(笔者一开始就是这么干的)。
2. 使用低版本的Android
在启动app之前选用Android 8.0之前的系统,在AVD Manager可选择这一内容。 若已装有低版本Android的虚拟机,切换到在此虚拟机上运行这两个app就好了。
下图是新建低版本Android虚拟机的步骤。



需要注意的是,不论是启动Service的app还是被启动Service的app,两者需要同时在虚拟机中运行,否则同样是无法启动的。若要查看app是否已运行,可在选择虚拟机选项(上图中有出现)的左侧查看,安卓图标右下角亮起时便代表此app已投入运行。