研究安卓应用保活黑科技已经有一段时间了,其实很多都是看看文章,博客,看完就忘了,今天休息,在家写写Demo,研究一下,跟大家分享。
学习资料:
希望每位读者也是跟本人一样,抱着学术研究的态度来了解双进程守护机制,如果要应用于自己的应用,请三思而后行!谢谢!
要实现双进程守护,首先需要解决的问题是:一般每个应用只对应一个进程,那么在安卓中一个应用如何开启双进程?相信大家跟我刚开始想这个问题时一样懵逼,如果你此刻已经想到了开启服务来解决进程问题,那你已经找到了解决问题的核心,如果你已经想到了运用远程服务,OK,你离成功就差那么一点点了!
其实,双进程守护很简单,简单到核心代码只有20行,咱们分3步来实现吧:
第一步:清单文件声明:
安卓中,我们定义一个服务,除了写一个类集成Service,还有一步很关键,就是在清单文件里声明这个服务,类似这样的操作:
<span style="font-size:14px;"><service android:name="com.example.doubleservice.LocalService"/></span>
其实,在声明服务时,我们还会看到一个叫做process的参数,你没有用过没关系,我也第一次使用,这个参数的意思就是指定声明的服务运行在哪个进程中,是不是感觉很厉害的样子!注意这里的参数值可以自己写,但是 格式不要写错:"."+参数名;这个坑我已经替大家踩过了。
<span style="font-size:14px;"> <service android:name="com.example.doubleservice.RecommendService" android:process=".recommendservice" /></span>
好了,现在你只要启动这两个服务,就会发现此时的应用已经对应了两个进程,是不是很意外,这么简单。
第二步:开启远程服务:
AIDL远程服务我就不跟大伙啰嗦了,直接在代码里新建一个文件,注意后缀名一定是.aidl,写完aidl大家会发现,在gen目录里已经生成了对应的java文件
接下来的任务是在服务类里,调用远程服务的存根,很关键的
class MyBinder extends ProcessService.Stub {
@Override
public String getServiceName() throws RemoteException {
// TODO Auto-generated method stub
return "localService";
}
}
第三步:开启并绑定服务
这一步的目的是使两个进程可以互相启动,互相绑定,在本地进程杀死的时候,开启远程进程,真正实现双进程守护,很简单,调用服务的startService和bindService的方法,bindService需要一个连接对象作为参数这个对象正好为我们所用,监听另外一个进程的状态!
/**
* 绑定方式开启服务需要实现ServiceConnection接口
*
* @author fflin
*
*/
class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Toast.makeText(LocalService.this, "远程服务启动了", 0).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(LocalService.this, "远程服务被杀死", 0).show();
// 在本地服务类里监听到远程服务有没有被杀死,被杀死则重新开启并绑定
LocalService.this.startService(new Intent(LocalService.this,RecommendService.class));
LocalService.this.bindService(new Intent(LocalService.this,RecommendService.class), conn, Context.BIND_IMPORTANT);
}
}
好了,核心代码已经写完了,是不是很简单,只有20行?这里演示的代码只是本地服务类的代码,那么另外的服务类该怎么写?很简单,复制+粘贴
具体的调用相信大家都没有问题,毕竟是一些基础一点的知识
private MyBinder binder;
private MyConn conn;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return binder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
binder = new MyBinder();
if (conn == null) {
conn = new MyConn();
}
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
//实现两个服务相互绑定
this.bindService(new Intent(this,RecommendService.class), conn, Context.BIND_IMPORTANT);
}
谢谢您的光顾,希望对您有一些帮助!