現在、アプリが使用するプラグインから外部サービスと通信しています。
バインドされたサービスは、最終的にアクティビティを開始し、アクティビティが終了したことをメイン アプリに通知します。
問題は、サービスがローカル ブロードキャストによって通知されることです。Messengermsg.replyTo
を変数に保存したので、Handler が終了した後にアクセスできますが、Service はまだバインドされています。
実際には機能しますが、NullPointer が不可能であることを完全に確認したいので、そのアプローチはあまり好きではありません。
Messenger を変数に格納するよりも、Binder に通信するためのより良い方法はありますか?
理解を深めるためのコードを次に示します。
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
if (intent.getAction().equals("activity_closed") && mReplyMessenger != null) {
mReplyMessenger.send(Message.obtain(null, MSG_RESULT_ACTIVITY_FINISHED));
}
} catch (RemoteException e) {
e.printStackTrace();
}
};
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
mReplyMessenger = null;
try {
switch (msg.what) {
case MSG_START_ACTIVITY: {
mReplyMessenger = msg.replyTo;
[...]
BridgeBinder.this.startActivity(i);
break;
}
[...]
default:
super.handleMessage(msg);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
final Messenger mMessenger = new Messenger(new IncomingHandler());
@Override
public IBinder onBind(Intent arg0) {
return mMessenger.getBinder();
}