当然完全不被杀死是不可能的,除非是系统级别的。能做的只能是确保被杀了后采取措施让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进程的所有通知和服务都没用了,也就是说强制停止上述方法都没用了。蛋疼了。。。