• 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


  • 相关阅读:
    之前总结的,现在要找工作了,给大家分享一下
    numpy总结
    django知识分支_1
    Django小总结
    ORM
    百度在线编辑器 配置修改
    百度在线编辑器
    TP5 路由使用
    cache 订单队列
    绘制静态地图API-高德地图
  • 原文地址:https://www.cnblogs.com/fengju/p/6336136.html
Copyright © 2020-2023  润新知