Android应用进程防杀指南2

编程入门 行业动态 更新时间:2024-10-08 08:30:02

Android应用<a href=https://www.elefans.com/category/jswz/34/1771450.html style=进程防杀指南2"/>

Android应用进程防杀指南2

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

假设我们的APP中开启了两个Service,分别是A和B,那么:
如果A守护B,则B挂掉的同时,A就应该把B启动起来,反之亦然,也就是说A和B应该是互相守护,无论谁被杀掉,对方就把它拉起来。

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

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

/*** @ClassName: LocalCastielService * @Description: 本地服务* @author 猴子搬来的救兵 * @version*/
public class LocalCastielService extends Service {MyBinder myBinder;private PendingIntent pintent;MyServiceConnection myServiceConnection;@Overridepublic void onCreate() {super.onCreate();if (myBinder == null) {myBinder = new MyBinder();}myServiceConnection = new MyServiceConnection();}@Overridepublic 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);// 设置service为前台进程,避免手机休眠时系统自动杀掉该服务startForeground(startId, notification);return START_STICKY;}class MyServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName arg0, IBinder arg1) {Log.i("castiel", "远程服务连接成功");}@Overridepublic void onServiceDisconnected(ComponentName arg0) {// 连接出现了异常断开了,RemoteService被杀掉了Toast.makeText(LocalCastielService.this, "远程服务Remote被干掉", Toast.LENGTH_LONG).show();// 启动RemoteCastielServiceLocalCastielService.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 {@Overridepublic String getProName() throws RemoteException {return "Local猴子搬来的救兵 ";}}@Overridepublic IBinder onBind(Intent arg0) {return myBinder;}}

RemoteCastielService.java

/*** * @ClassName: RemoteCastielService * @Description: 远程服务* @author 猴子搬来的救兵 */
public class RemoteCastielService extends Service {MyBinder myBinder;private PendingIntent pintent;MyServiceConnection myServiceConnection;@Overridepublic void onCreate() {super.onCreate();if (myBinder == null) {myBinder = new MyBinder();}myServiceConnection = new MyServiceConnection();}@Overridepublic 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);//设置service为前台进程,避免手机休眠时系统自动杀掉该服务startForeground(startId, notification);return START_STICKY;}class MyServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName arg0, IBinder arg1) {Log.i("castiel", "本地服务连接成功");}@Overridepublic void onServiceDisconnected(ComponentName arg0) {// 连接出现了异常断开了,LocalCastielService被杀死了Toast.makeText(RemoteCastielService.this, "本地服务Local被干掉", Toast.LENGTH_LONG).show();// 启动LocalCastielServiceRemoteCastielService.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 {@Overridepublic String getProName() throws RemoteException {return "Remote猴子搬来的救兵 ";}}@Overridepublic IBinder onBind(Intent arg0) {return myBinder;}}

aidl文件

package com.castiel.aidl;
interface CastielProgressConnection{String getProName();
}

启动服务

public class MainActivity extends Activity {@Overrideprotected 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服务,你中有我我中有你,一旦两个服务发现对方被杀掉,另一服务立刻会启动并连接它,下面我给大家演示一下。

查看一下系统打印日志:

更多推荐

Android应用进程防杀指南2

本文发布于:2024-02-28 07:39:11,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768780.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进程   指南   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!