AIDL死亡コールバック

1770 ワード

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);