如何保证service不被杀死

当然完全不被杀死是不可能的,除非是系统级别的。能做的只能是确保被杀了后采取措施让service再重新启动。

综合网上说的方法,做了以下一些措施保证service被杀后再启动:

1.在service里面重写onStartCommand方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重新创建

@Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                // TODO Auto-generated method stub
                Log.v("TrafficService","startCommand");
                flags =  START_STICKY;
                return super.onStartCommand(intent, flags, startId);
//                return  START_REDELIVER_INTENT;
        }

2.在Service的onDestroy()中重启Service:
public void onDestroy() {   
        Intent localIntent = new Intent();
        localIntent.setClass(this, MyService.class);  //销毁时重新启动Service
        this.startService(localIntent);
    }

其他还有一些措施比如提高service优先级,把service设置为前台进程等。

请参考:http://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.html

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=169411

以上只是做了一些简单的措施重启service,但如果用户手动强制停止了app则没用了。所以可以通过下面2个措施来重启service。

3.通过开机启动监听广播,然后通过AlarmManager隔一段时间检查service是否启动。如果用户停止整个应用(在管理应用程序中停止应用,或者第三方软件停止整个应用),此时整个进程被杀死,所有的服务自然也被杀死了,timmer,或者alarmManager也就停止了。此时就不会再定期启动服务了。不过比如360等清理内存还是可以运行的。

参考:http://blog.csdn.net/arui319/article/details/7040980

http://blog.csdn.net/ryantang03/article/details/9317499

4.如果以上都没用了,则最后可以可以用解锁动作android.intent.action.USER_PRESENT来启动AlarmManager ,从而保证service能运行,用户不可能一直不锁屏解锁开在那吧,这有点带有侥幸心理,但绝大部分情况下是肯定能确保的。

参考:http://blog.csdn.net/jiujie_/article/details/6708697


通过以上几个措施,大部分情况下应该能确保service运行。

经验证,只要是用户手动强制停止app,则依附该app进程的所有通知和服务都没用了,也就是说强制停止上述方法都没用了。蛋疼了。。。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值