打不死的小强--双进程守护

闲来无事研究一下android中的双进程守护。

首先创建两个service(LocalService,RemoteService),然后再AndroidManifest.xml文件中进行注册。

<service android:name=".service.LocalService"/>
<service
        android:name=".service.RemoteService"
        android:enabled="true"
        android:process=".myremoteservice"/>

android实现进程间的数据通信,可以创建一个aidl文件,然后定义相应的接口生成对应的.java文件。

interface IDoubleProcess {
   String getServiceName();
}

开启服务:

   //开启服务
        mContext.startService(new Intent(mContext,LocalService.class));
        mContext.startService(new Intent(mContext,RemoteService.class));

然后在onStart(Intent intent, int startId)方法中进行服务的交叉绑定。

/**
 * @author rongtao
 * 本地服务
 */
public class LocalService extends Service {
    private static final String TAG = "LocalService";
    private MyBinder mMyBinder;
    private MyConn mMyConn;
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return mMyBinder;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        mMyBinder=new MyBinder();
        if(mMyConn==null){
            mMyConn=new MyConn();
        }
    }
    @Override
    public void onStart(Intent intent, int startId) {
//绑定远程服务
        LocalService.this.bindService(new Intent(LocalService.this,RemoteService.class),
                mMyConn, Context.BIND_IMPORTANT);

    }
    class MyBinder extends IDoubleProcess.Stub{

        @Override
        public String getServiceName() throws RemoteException {
            return LocalService.class.getSimpleName();
        }
    }
    class MyConn implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected: 绑定远程服务成功");

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

            Log.d(TAG, "onServiceDisconnected: 绑定远程服务失败");
            Toast.makeText(LocalService.this,"onServiceDisconnected: 绑定远程服务失败",0).show();
            //开启远程服务
            LocalService.this.startService(new Intent(LocalService.this,RemoteService.class));
            //绑定远程服务
            LocalService.this.bindService(new Intent(LocalService.this,RemoteService.class),mMyConn, Context.BIND_IMPORTANT);
        }
    }

    @Override
    public void onDestroy() {

        //开启远程服务
        LocalService.this.startService(new Intent(LocalService.this,RemoteService.class));
        //绑定远程服务
        LocalService.this.bindService(new Intent(LocalService.this,RemoteService.class),mMyConn, Context.BIND_IMPORTANT);
        LocalService.this.unbindService(mMyConn);
        super.onDestroy();
    }
}
/**
 * @author rongtao
 *  模拟远程服务
 */
public class RemoteService extends Service {
    private MyBinder mMyBinder;
    private MyConn mMyConn;
    private static final String TAG = "RemoteService";
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return mMyBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mMyBinder=new MyBinder();
        if(mMyConn == null) {
            mMyConn=new MyConn();
        }
    }


    @Override
    public void onStart(Intent intent,  int startId) {

         //绑定本地服务
        RemoteService.this.bindService(new Intent(RemoteService.this,LocalService.class),
                mMyConn, Context.BIND_IMPORTANT);
    }

    class MyBinder extends IDoubleProcess.Stub{

        @Override
        public String getServiceName() throws RemoteException {
            return RemoteService.class.getSimpleName();
        }
    }
    class MyConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected: 绑定本地服务成功");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "onServiceDisconnected: 绑定本地服务失败");
            Toast.makeText(RemoteService.this,"onServiceDisconnected: 绑定本地服务失败",0).show();
            //开启本地服务
            RemoteService.this.startService(new Intent(RemoteService.this,LocalService.class));
            //绑定本地服务
            RemoteService.this.bindService(new Intent(RemoteService.this,LocalService.class),mMyConn, Context.BIND_IMPORTANT);
        }
    }

    @Override
    public void onDestroy() {
        //开启本地服务
        RemoteService.this.startService(new Intent(RemoteService.this,LocalService.class));
        //绑定本地服务
        RemoteService.this.bindService(new Intent(RemoteService.this,LocalService.class),mMyConn, Context.BIND_IMPORTANT);
        super.onDestroy();
    }
}

在手动强制停止服务的时候本地服务会报异常,就是服务没有解绑,但是我在onDestroy()中进行解绑后就会出现双进程断了绑定,多杀几次还是会强制停止的,所以我在onDestroy()中重新开启,重新绑定,思路有点乱了。这样避免了抛出异常,反而生命力增强了不少。

用360进行清理进程,360这个大骗子会告诉你已经清理成功,但是在后台任务中任可以看到该进程还存在着,就是没有启动起来而已,如果在这个时候进行手动强力清除的话,就可以将其彻底关闭,不然等上几十秒双进程又开始工作了,这个时候手动真的就没办法停止了,其实这个东西还能扩展的更好,可以在手机重启的时候做点小手脚他就真的
死不了了 。一般的用户对手机管家类的软件都很 信任,报清理了多少内存 都是障眼法,清理软件扫描过以后有一部分
进程会被干掉,但是级别较高的做多是睡眠状态,不到一分钟又会重启的,这也就是手机为什么越用越卡的一个原因。

我上面的代码仅供参考,bug很多,求指点。

本人喜欢研究一些乱七八道的东西 ,不过面试用不到。

同样的文章网上 已经太多,但是我写的是自己的想法而已。

博客只是用来记录我们每天的生活而已,激励自己坚持学习的一种方式。是手段不是目的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值