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


发布评论