AIDL服务死亡代理

通过AIDL与服务端进行通信时,意外发生服务终止的解决方法。

1、设置服务死亡代理deathRecipient

  private final ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            isConnection = true;
            sceneAPI = IModeAPI.Stub.asInterface(iBinder);
            try {
                sceneAPI.asBinder().linkToDeath(deathRecipient, 0);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
            LogUtils.e(TAG, "mode control service connection successful");
          
        }

2、在代理对象中重连服务

    /**
     * 重连服务
     */
    private void reconnectService() {
        Log.d(TAG, "mode control service binder died");
        sceneAPI.asBinder().unlinkToDeath(deathRecipient, 0);
        ThreadUtils.runOnUiThreadDelayed(this::bindServiceInvoked, 1000);
    }

    /**
     * 设置服务死亡代理
     */
    IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            isConnection = false;
            reconnectService();
        }
    };

    /**
     * 绑定服务
     */
    public void bindServiceInvoked() {
        Intent intent = new Intent();
        intent.setAction(SERVICE_ACTION);
        intent.setPackage(SERVICE_PACKAGE);
        isConnection = context.bindService(intent, connection, Context.BIND_AUTO_CREATE);
    }

 

posted @ 2022-08-29 14:48  随易来了  阅读(303)  评论(0编辑  收藏  举报