双进程守护实现杀不死的进程

如何开启两个进程

  • 一个进程干掉 他的服务全部收掉 百度了很多 有人说在onDestory中重启服务 但是试过发现还是太天真
  • 所以我们就用两个进程来解决这间事情 一个进程被干掉 另一个马上将他重启 这主要就涉及到 进程间通信ipc-(interprocess communication) aidl-(Android Interface Definition Language

  • 那么怎么再搞一个进程呢? 其实给他起个名字就行了 如下带码块

<service android:name=".LocalService"/>
<service android:name=".RemoteService" android:process=".remoteservice"/>
  • 而且我们知道一个进程分配的内存是有限的,很多大厂的app都是两个进程。

定义aidl

  • 为了完成进程间的通信 我们需要定义定义aidl
    KeepAliveService .aidl
package com.reige.keepaliveservice;
interface KeepAliveService {
    String getServiceName();
}

定义两个Service

  • 这里就很熟悉了 只是需要定义一个内部类MyBinder 继承 KeepAliveService.Stub
public class LocalService extends Service {
    private MyBinder binder;
    private MyConn conn;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

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

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), conn, Context.BIND_IMPORTANT);
    }

    class MyBinder extends KeepAliveService.Stub {
        @Override
        public String getServiceName() throws RemoteException {
            return "LocalService";
        }
    }

    class MyConn implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
        }
        /*连接发生异常 正常关闭不走该方法*/
        @Override
        public void onServiceDisconnected(ComponentName name) {
            LocalService.this.startService(new Intent(LocalService.this, RemoteService.class));
            LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class),
                    conn, Context.BIND_IMPORTANT);
        }
    }
}
public class RemoteService extends Service {
    private MyBinder binder;
    private MyConn conn;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

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

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
    }

    class MyBinder extends KeepAliveService.Stub {
        @Override
        public String getServiceName() throws RemoteException {
            return "RemoteService";
        }
    }

    class MyConn implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
        }

        /*连接发生异常 正常关闭不走该方法*/
        @Override
        public void onServiceDisconnected(ComponentName name) {
            RemoteService.this.startService(new Intent(RemoteService.this, LocalService.class));
            RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
        }
    }
}

最后启动他们

  • 在MainAcivity onCreat方法中中启动他们
this.startService(new Intent(MainActivity.this,LocalService.class));
this.startService(new Intent(MainActivity.this,RemoteService.class));

效果图

然后我们打开手机应用详情就能看到跑起来的两个进程和两个服务了,试着去停止他们,你会发现他们已经不听我们的了。当然,为了保险,做到真正的不被杀死,我们还可以监听广播来自动启动我们的应用,比如解锁电量变化等等
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值