AIDL死亡回调

       AIDL常用在android服务端与客户端之间的通信中,容易发生客户端或者服务端死亡,无法通知到对端情况,从而造成客户端不知服务端死亡或者服务端不知客户端死亡,还在进行数据回调操作。

1   客户端意外死亡在服务端的监听方式

       服务端通过监听服务端设置的AIDL回调,实现死亡代理,服务端在监听到死亡代理时,将已死亡的客户端回调移除。

        

callback.asBinder().linkToDeath(new IBinder.DeathRecipient() {
    @Override
    public void binderDied() {
        Log.d("binder", "客户端死亡啦~!");
    }
}, 0);

2   客户端意外死亡在服务端的监听方式

      

//死亡接受者
IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {
	@Override
	public void binderDied() {
        //服务端死亡
		if (iMyAidlInterface != null) {
			//注销监听和回收资源
			iMyAidlInterface.asBinder().unlinkToDeath(this, 0);
			iMyAidlInterface = null;
		}
	}
};
private IMyAidlInterface iMyAidlInterface;

class Myconnect implements ServiceConnection {


	//连接的成功的时候回调
	@Override
	public void onServiceConnected(ComponentName name, IBinder service) {
		Log.d(TAG, "onServiceConnected() called with: name = [" + name + "], service = [" + service + "]");


		iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);

		try {
			//连接死亡监听
			service.linkToDeath(deathRecipient, 0);
		} catch (RemoteException e) {
			e.printStackTrace();
		}


		//解绑服务
//            unbindService(myconnect);
	}

	//断开连接的时候回调
	@Override
	public void onServiceDisconnected(ComponentName name) {

		Log.d(TAG, "onServiceDisconnected() called with: name = [" + name + "]");
	}
}

  2   客户端意外死亡在服务端的监听方式

     当无需使用死亡代理时亦可通过unlinkToDeath解除死亡代理模式

  iMyAidlInterface.asBinder().unlinkToDeath(this, 0);

 

你可能感兴趣的:(android/java理解)