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

时间:2018-07-16 08:41:04

标签: android service background android-8.0-oreo

我已将我的应用升级到API 26,而新的background execution limits则遇到了一些问题。

在Oreo设备上,我的应用程序进入后台后,由于日志中记录的空闲状态,我的应用程序被操作系统停止:

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

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

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中返回START_STICKY,这应该告诉操作系统服务应在documentation中被杀死后重新启动:

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

恒定从onStartCommand(Intent,int,int)返回:如果此   服务的进程在启动时被杀死(从中返回后   onStartCommand(Intent,int,int)),然后使其处于启动状态   但不要保留这种传达的意图。稍后系统将尝试   重新创建服务。

知道我在做什么错吗?

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

1 个答案:

答案 0 :(得分:3)

从Android O开始,应用程序可以自由访问后台服务的方式受到限制。如果您的应用未运行在前台,则服务将由操作系统终止,就像调用Window一样。这就是ICommand在这种情况下无法救援的原因。

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