プロセス間通信で DeadObjectException が起きる状況を手軽に作る

  • 12
    いいね
  • 0
    コメント

DeadObjectExceptionとは

DeadObjectExceptionとは、死んでしまったプロセスを相手にプロセス間通信を試みた場合に投げられる例外です。
プロセス間通信では、相手のプロセスが生きているかどうかを考慮する必要があります。この例外が発生した場合、呼び出し元(自分)のプロセスは代替手段で処理を続行するか、新しい相手のプロセスにバインドして、死んでしまったプロセスを相手にプロセス間通信をしないようにしなければなりません。

一方で、プロセスがいつ死ぬかはシステムに委ねられているため、自分ではどうしようもない部分でもあります。ただし、強制的にプロセスを殺して、相手のプロセスが死んだ状況を作り出すことはできるので、意図的に相手のプロセスを殺すことで、DeadObjectException が発生した時のハンドリングをテストすることができます。

設定からプロセスを殺す

Android の設定には、アプリケーションの管理をする項目のなかに、アプリケーションを強制終了する機能があります。
この機能を使えば、プロセスをまるごと止めてしまうことができるので、DeadObjectExceptionをテストできます。

adb shell からプロセスを殺す

より手軽に相手のプロセスを殺す場合は、amコマンドを使用します。
am force-stop <package-name>で、アプリのパッケージを指定することでもプロセスを殺すことができます。

相手のプロセスが死んだことを検知する

相手のプロセスが死んだ場合、メソッド呼び出しで投げられる例外をキャッチする以外にも、プロセスの死亡を検知することができ、このために用意されたインタフェースが
IBinder.DeathRecipientです。

IBinder.DeathRecipient の実装例

大まかな仕組みや使い方は「(Yukiの枝折: Android:DeathRecipientで他プロセスの死亡を検知する)[http://yuki312.blogspot.jp/2013/02/androiddeathrecipient.html?m=1]」をご覧ください。

サポートライブラリ内にも実装クラスがあります。MediaControllerCompat.Callbackでは、IBinder.DeathRecipient#binderDied()MediaControllerCompat.Callback#onSessionDestroyed()を呼び出すようになっています。