关于android service 重启
现在有这样的需求,防止自己的app被其他的应用程序(比如qq手机管家)杀死,该怎么实现呢。我们知道app都是运行在进程中的,android是怎样管理这些进程的呢。要想app不被杀死,只要做到进程不被结束就解决了问题。但是不幸的是,第三方app很容易利用系统的api(比如killBackProgress())轻易杀死其他进程。那该怎么办呢?
目前有这样的解决方案。在本进程被其他应用程序杀死后,就立即重启,这样就可以间接防止进程被结束(其实已结束了,只重新开启)。至今为止,还未知道怎样完全防止第三方结束本进程,正在寻找中。。。。。。。。。。。。。
现在问题又来了,自己的应用怎么知道什么时候被杀死了,杀死之后又怎么重启呢?答案是,无法知道,自己也无法重启。幸好android提供了service,android规范中指出进驻有service的进程的优先级别很高,除非是本应用自己调用stopService结束服务,否则即使第三方应用杀死该进程,而后进程也会自己重启(服务也重启)
所以说,要想进程被杀死后能自动重启,那么只需要在该进程中开启某个服务就可以了。
补充:
1、通过 设定-》应用程序-》运行 结束某个进程或服务,这样进程或服务不会重启。
2、如果采用bindService()方法启动服务,那么在 设定-》应用程序-》运行是看不到此项服务信息的。这样的服务也可被”qq手机管家“永远杀死,不在重启。
结论:无法防止其他应用程序杀死自己进程或服务(系统自带的服务管理外),但是可以在杀死后重启。
另外,可以设置service属性:
每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,这个方法return 一个int值,return 的值有四种:
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。