1

現在、アプリが使用するプラグインから外部サービスと通信しています。

バインドされたサービスは、最終的にアクティビティを開始し、アクティビティが終了したことをメイン アプリに通知します。

問題は、サービスがローカル ブロードキャストによって通知されることです。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();
}
4

2 に答える 2

0

同じ方法で双方向メッセンジャーを実装しています。ハンドラーがアクティビティへの古い参照 (したがって NPE) を取得していることは実際にはわかりませんが、特に注意したい場合は、 onResume() メソッドで毎回、または毎回でも参照を更新してみてください。メッセージを受け取ります。

于 2012-06-18T19:21:33.483 に答える