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

标签 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

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

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;
}

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

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

关于当应用程序从空闲状态返回时,Android 服务不会重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51357772/

相关文章:

java - 在用户与按钮交互后,在 Activity 上禁用按钮

ssl - 如何在 K8S 中配置服务以在 *_SERVICE_HOST 变量中设置主机名而不是 IP 地址

php - 在后台centos服务器运行php脚本

java - 检查android手机存储中是否存在已知文档Uri

java - 转换到另一个 Activity 时保存成员变量

Android远程服务启动和停止

android - 后台服务需要在服务器上发送 GPS 位置

time - 根据时间改变背景 - Objective C

android - ActionBarSherlock 上 activatedBackgroundIndicator 的自定义背景不起作用

java - 如何设置wifi direct的接口(interface)设备名称