您的位置:首页 > 移动开发 > Android开发

Android中利用服务来守护进程

2014-10-20 23:27 127 查看
我们写程序的时候,肯定会用到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: