Android 当应用程序从空闲状态恢复时服务未重新启动

Android service not restarted when app back from idle state

我已经将我的应用程序升级到 API 26,但我在使用新的 background execution limits 时遇到了一些问题。

在 Oreo 设备上,一旦我的应用程序进入后台,我的应用程序就会因 OS 由于日志中所写的空闲状态而停止:

Stopping service due to app idle: u0a80 com.example.test/com.example.test.service1
Stopping service due to app idle: u0a80 com.example.test/com.example.test.service2

然后,我尝试再次启动我的应用程序,最后一个 activity 已正确恢复(包括其片段和显示的所有数据)

07-16 10:21:51.253 system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.test/com.example.test.activity1 bnds=[317,1159][586,1508]} from uid 10024

问题是我的服务没有重启。

它们都在 onStartCommand 中 returns START_STICKY 应该告诉 OS 服务应该在被杀死后重新启动,因为它是 documentation 中的状态:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

Constant to return from onStartCommand(Intent, int, int): if this service's process is killed while it is started (after returning from onStartCommand(Intent, int, int)), then leave it in the started state but don't retain this delivered intent. Later the system will try to re-create the service.

知道我做错了什么吗?

是否可以在不显式调用 startService 或 bindService 方法的情况下恢复服务?

从Android开始 O 对应用访问后台服务的自由度有限制。如果您的应用程序不是 运行 是前台的,那么服务将被 OS 终止,就像调用 stopSelf() 一样。这就是为什么 START_STICKY 在这种情况下不会救援的原因。

您需要在创建 Activity 时重新启动服务,或者创建 ForegroundService 并执行直到您的任务完成。

当您的应用设置为在后台限制为 运行 时,也可能会发生这种情况(转到您的应用的设置,然后转到电池,然后寻找选项 'allow background activity') .如果应用被限制,服务将在几分钟后自动停止。