当应用程序从空闲状态返回时,Android 服务未重新启动

nbe*_*_42 6 service android background android-8.0-oreo

我已将我的应用程序升级到 API 26,但我在新的后台执行限制方面遇到了一些问题。

在奥利奥设备上,只要我的应用程序进入后台,我的应用程序就会由于日志中写入的空闲状态而被操作系统停止:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

它们都在 onStartCommand 中返回 START_STICKY ,它应该告诉操作系统该服务应该在被杀死后重新启动,因为它是文档中的状态:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)

从 onStartCommand(Intent, int, int) 返回的常量:如果此服务的进程在启动时被终止(从 onStartCommand(Intent, int, int) 返回后),则将其保留在已启动状态但不要保留此传递的意图。稍后系统将尝试重新创建该服务。

知道我做错了什么吗?

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

Sag*_*gar 5

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

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