我们写程序的时候,肯定会用到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