AIDL死亡コールバック
1770 ワード
AIDLはandroidサービス側とクライアント間の通信でよく用いられ、クライアントまたはサービス側の死亡が発生しやすく、対端の状況を通知できず、クライアントがサービス側の死亡を知らないか、サービス側がクライアントの死亡を知らないか、データコールバック操作を行う.
1 クライアントがサービス側で予期せぬ死亡した場合のリスニング方法
サービス側は、サービス側が設定したAIDLコールバックを傍受することによって、死亡エージェントを実現し、サービス側は死亡エージェントを傍受すると、死亡したクライアントコールバックを削除する.
2 クライアントがサービス側で予期せぬ死亡した場合のリスニング方法
2 クライアントがサービス側で予期せぬ死亡した場合のリスニング方法
死亡エージェントを使用しなくてもunlinkToDeathで死亡エージェントモードを解除できます
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);