Android 进程防杀指南,Android 应用进程防杀指南 2 - 双进程守护

在上一篇博客中,我们谈到了Android进程防杀的常用套路,各位童鞋可以点击查看我的博客Android应用进程防杀指南1-常用套路,随着越来越多的用户手机安装某卫士,某管家,常用的进程防杀套路并不能够很好的保证我们的APP进程常驻,因此本篇博客我给大家带来抗某卫士,某管家的双进程守护解决方案。双进程守护,其实原理非常简单,网上也有很多博文讲述,今天我给大家用一个完整的案例来讲述。

假设我们的APP中开启了两个Service,分别是A和B,那么:

如果A守护B,则B挂掉的同时,A就应该把B启动起来,反之亦然,也就是说A和B应该是互相守护,无论谁被杀掉,对方就把它拉起来。

既然提到了两个Service,那么这两个Service就不能让它们同处在一个进程中,否则就会被一次性双杀。这里我们很容易想到IPC技术,在Android中通常我们可以使用AIDL来实现IPC操作。废话不多说,直接撸码。

先来看下项目整体结构:

18e9f8c8712aa8f001259b3e5d3c2a74.png

这里,我们定义两个Service,分别是LocalCastielService和RemoteCastielService,其中的RemoteCastielService我们通过属性配置android:process=”:com.castiel.remote” ,让它成为远端进程。

LocalCastielService.java

/**

* @ClassName: LocalCastielService

* @Description: 本地服务

* @author 猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai

* @version

*/

public class LocalCastielService extends Service {

MyBinder myBinder;

private PendingIntent pintent;

MyServiceConnection myServiceConnection;

@Override

public void onCreate() {

super.onCreate();

if (myBinder == null) {

myBinder = new MyBinder();

}

myServiceConnection = new MyServiceConnection();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

this.bindService(new Intent(this, RemoteCastielService.class), myServiceConnection, Context.BIND_IMPORTANT);

Notification notification = new Notification(R.drawable.ic_launcher, "猴子服务启动中", System.currentTimeMillis());

pintent = PendingIntent.getService(this, 0, intent, 0);

notification.setLatestEventInfo(this, "猴子服务", "防止被杀掉!", pintent);

startForeground(startId, notification);

return START_STICKY;

}

class MyServiceConnection implements ServiceConnection {

@Override

public void onServiceConnected(ComponentName arg0, IBinder arg1) {

Log.i("castiel", "远程服务连接成功");

}

@Override

public void onServiceDisconnected(ComponentName arg0) {

Toast.makeText(LocalCastielService.this, "远程服务Remote被干掉", Toast.LENGTH_LONG).show();

LocalCastielService.this.startService(new Intent(LocalCastielService.this, RemoteCastielService.class));

LocalCastielService.this.bindService(new Intent(LocalCastielService.this, RemoteCastielService.class),

myServiceConnection, Context.BIND_IMPORTANT);

}

}

class MyBinder extends CastielProgressConnection.Stub {

@Override

public String getProName() throws RemoteException {

return "Local猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai";

}

}

@Override

public IBinder onBind(Intent arg0) {

return myBinder;

}

}复制代码

RemoteCastielService.java

/**

*

* @ClassName: RemoteCastielService

* @Description: 远程服务

* @author 猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai

*/

public class RemoteCastielService extends Service {

MyBinder myBinder;

private PendingIntent pintent;

MyServiceConnection myServiceConnection;

@Override

public void onCreate() {

super.onCreate();

if (myBinder == null) {

myBinder = new MyBinder();

}

myServiceConnection = new MyServiceConnection();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

this.bindService(new Intent(this,LocalCastielService.class), myServiceConnection, Context.BIND_IMPORTANT);

Notification notification = new Notification(R.drawable.ic_launcher,

"猴子服务启动中",

System.currentTimeMillis());

pintent=PendingIntent.getService(this, 0, intent, 0);

notification.setLatestEventInfo(this, "猴子服务",

"防止被杀掉!", pintent);

startForeground(startId, notification);

return START_STICKY;

}

class MyServiceConnection implements ServiceConnection {

@Override

public void onServiceConnected(ComponentName arg0, IBinder arg1) {

Log.i("castiel", "本地服务连接成功");

}

@Override

public void onServiceDisconnected(ComponentName arg0) {

Toast.makeText(RemoteCastielService.this, "本地服务Local被干掉", Toast.LENGTH_LONG).show();

RemoteCastielService.this.startService(new Intent(RemoteCastielService.this,LocalCastielService.class));

RemoteCastielService.this.bindService(new Intent(RemoteCastielService.this,LocalCastielService.class), myServiceConnection, Context.BIND_IMPORTANT);

}

}

class MyBinder extends CastielProgressConnection.Stub {

@Override

public String getProName() throws RemoteException {

return "Remote猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai";

}

}

@Override

public IBinder onBind(Intent arg0) {

return myBinder;

}

}复制代码

aidl文件

package com.castiel.aidl

interface CastielProgressConnection{

String getProName()

}复制代码

启动服务

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

startService(new Intent(this, LocalCastielService.class));

startService(new Intent(this, RemoteCastielService.class));

}复制代码

通过以上代码可以看出,双进程守护实现代码非常简单,两个服务相互连接,Local服务连接着Remote服务,Remote服务又连接着Local服务,你中有我我中有你,一旦两个服务发现对方被杀掉,另一服务立刻会启动并连接它,下面我给大家演示一下。

2fe50c2d4e45f7a881fcb9582a3c2418.gif

查看一下系统打印日志:

d54a1a0943ee513b6ba80fc92caab469.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值