2024年3月30日发(作者:)

关于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

后一定能重启。