Android中利用服务来守护进程

        我们写程序的时候,肯定会用到Service,而且还不止使用一个。当我们的程序中用到了Service的时候,说不定会被停掉。例如像360这样的杀毒软件可能会误操作对我们的Service有威胁。那么我们就需要对我们的Service进行一个保护,也就是这里所说的守护。

        那么问题就来了,要怎么守护呢?说到守护,当然不可能是自己守护自己,那么这里就必然会存在另一个进程,理论上用Context的向下转型的类都是可以的,不过一般情况下我们只是用Service对Service进行一个守护,原因很简单,我们不关心Service是否存在,因为它对于用户是一个“暗地里”的东西。试想一下,如果我们利用Activity对Service进行一个守护,那么当Activity因为某种操作销毁了,怎么办?可能你要问,可不可以,我想是可以的。

        这里如果我们要用A来守护B,那我们就可以会说如果A被停掉了,又该怎么办。既然A可以守护B,B当然也是可以守护A的。

具体实现的关键代码如下:

首先,重写Service的onStartCommand方法,这里要注意不是onStart方法,因为在Android2.0以后,对于Service的开始方法,用的是onStartCommand,而onStart会在有onStartCommand的情况下,被忽视。

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        thread.start();
        return START_STICKY;
    }
接下来就通过一个子线程来实时检测我们Service是否死掉了,如果发现我们所检测的Service死了,则进行重启。

Thread thread = new Thread(new Runnable() {
        
        @Override
        public void run() {
            Timer timer = new Timer();
            TimerTask task = new TimerTask() {
                
                @Override
                public void run() {
                    boolean b = MainActivity.isServiceWorked(ServiceOne.this, "com.example.servicedemo.ServiceTwo");
                    if(!b) {
                        Intent service = new Intent(ServiceOne.this, ServiceTwo.class);
                        startService(service);
                    }
                }
            };
            timer.schedule(task, 0, 1000);
        }
    });
大家可以看到上面有一个isServiceWorked方法,顾名思义,这个方法就是用来检测所守护的Service是否还活着。实现如下:

public static boolean isServiceWorked(Context context, String serviceName) {
        ActivityManager myManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        ArrayList<RunningServiceInfo> runningService = (ArrayList<RunningServiceInfo>) myManager.getRunningServices(Integer.MAX_VALUE);
        for (int i = 0; i < runningService.size(); i++) {
            if (runningService.get(i).service.getClassName().toString().equals(serviceName)) {
                return true;
            }
        }
        return false;
    }
这里程序没有写测试线程的方法,不过我想难不到大家,笔者在这里偷了个懒。
如果你跟我一样不想写这一部分的代码,你大可打开手机设置中的应用程序功能,里面就有关于测试的方法。你可以选择运行的程序页,再选择你现在的程序,会看到程序的进程和服务个数以及具体情况,点进去,会看到你程序中所开启的服务和进行,有一个停止按钮,点击停止,如果你的程序可以用,那么在停止一两秒之后,服务又会被开启的。

右侧是本博文工程连接:http://download.csdn.net/detail/u013761665/8061695


原文地址:https://www.cnblogs.com/fengju/p/6336136.html