我已将我的应用升级到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方法的情况下还原服务?
答案 0 :(得分:3)
从Android O开始,应用程序可以自由访问后台服务的方式受到限制。如果您的应用未运行在前台,则服务将由操作系统终止,就像调用Window
一样。这就是ICommand
在这种情况下无法救援的原因。
您需要在创建Activity时重新启动服务,或者创建ForegroundService并执行直到任务完成。