Android service在某些Android版本上被kill后无法自动启动

Android widget插件,需要服务一直运行,定时更新时间及天气数据,但是在Android 7.0的设备上测试没有问题,虽然锁屏一段时间后,即手机进入休眠状态后,服务会暂停,但手机在亮屏的瞬间,服务会重新启动。这是在控制功耗的情况下比较完美解决。

然鹅,运行在Android 9.0的设备上,问题就出现了,就算不锁屏运行一段时间后,服务都会自动终止,且无法重新启动,手机关机重启后,没启动。

在博客上看前辈的解决方案,大都是如下的解决方案

1、让服务持续运行而不受手机休眠的影响,要这样处理:
在onCreate里面添加:

pm = (PowerManager)MyApplicationHolder.getContext().getSystemService(Context.POWER_SERVICE);  
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myservice");  
wl.acquire();  
在onDestroy里添加:

wl.release();  

这种处理方案显然不适合我的这种情况。

后来在onStartCommand方法中有几个变量:

START_STICKY 
系统重新创建服务并且调用onStartCommand()方法,但并不会传递最后一次传递的intent,
只是传递一个空的intent。除非存在将要传递来的intent,那么就会传递这些intent。
这个适合播放器一类的服务,不需要执行命令,只需要独自运行,等待任务。
START_NOT_STICKY 
系统不重新创建服务,除非有将要传递来的intent。
这是最安全的选项,可以避免在不必要的时候运行服务。
START_REDELIVER_INTENT 
系统重新创建服务并且调用onStartCommand()方法,传递最后一次传递的intent。
其余存在的需要传递的intent会按顺序传递进来。
这适合像下载一样的服务,立即恢复,积极执行。

解决方案:手动返回START_STICKY,亲测这样设置后,原问题解决,且观测手机唤醒曲线,证明这样设置不会造成额外的性能消耗。


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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值