研究安卓应用保活黑科技已经有一段时间了,其实很多都是看看文章,博客,看完就忘了,今天休息,在家写写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文件

   

android 守护进程aidl 安卓进程守护软件_ide

接下来的任务是在服务类里,调用远程服务的存根,很关键的


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);
	}

        谢谢您的光顾,希望对您有一些帮助!