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

笔者最近在一项目开发中遇到这样一个需求,要在自己应用中启动了一个service,这

个service用来监听服务器发过来的推送信息并弹出一个对话框显示信息,所以需要保证

这个service时时运行着,且不能被任务管理或是系统的设置等工具杀掉,如果services

是被杀死,则需要自动重启这service,笔者在网上查询一下,找到一些类似的问题文章,

现在把它在总结记录下来,以方便需要实现像我这样的要求的朋

友有帮助,希望大家都能写永远不会被KILL掉的进程/服务,也就是不受系统垃圾回收机

制(内存管理)影响。

网络对此问题的解决建议:

(1)

在service中重写onStartCommand方法,这个方法有三个返回

值, START_STICKY是service被kill掉后自动重写创建

@Override public int onStartCommand(Intent intent, int flags, int startId) { r

eturn START_STICKY; }

(2)

在Service的onDestroy()中重启Service.

public void onDestroy() {

Intent localIntent = new Intent();

ss(this, ); //销毁时重新启动Service

ervice(localIntent);

}

对于(2)此解决方案,笔者自己写了一个代码测试了一下,1:如果是在系统的settings

中的DOWNLOADED关闭整个应用(Force stop),则这个services类中的onDestory方

法没有监听到(services类的onDestory方法的log没有打印日志),如果是在系统里的

setting中的RUNNING杀掉项目services,则onDestory方法则会监听到(services类

的onDestory方法的log有打印日志),所以对于此解决方案并不是一定适用,2:或是通

过别的应用,直接kill掉我的应用时,也是不会调用services类的onDestory方法的,

(3)

再写另外一个apk,用一个广播来监听这个APK是否被关闭,如果是关闭了则重启

这个APK,而这里我们为什么要用另外一个APK?因为被关闭的应用程序不能检测到自己

被关闭的事件,只能接收到其他应用被关闭的广播。这个action的recever

public class ProtectorHelperReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String pkg = "ector";// 被kill的应用的包名

String action = pkg + "._SERVICE";// 重启service的acition