どういうわけか私はこれを混乱させます:
アクティビティとバインドされたサービスが同じプロセスで実行され、アクティビティとバインドされたサービス (通知を使用してフォアグラウンドに設定されている) の間で非同期に通信したい場合、両側でハンドラーをどのように使用しますか? 私が理解していない部分は、アクティビティ側とサービス側の両方が同じスレッド (UI スレッド) で実行されるということです。つまり、同じハンドラーです。
以前は次のようにプログラムしていました。バインドされたサービスでハンドラーを作成し、そのハンドラーを Messenger に入れ、onBind() メソッドで Messenger を返します。アクティビティ側では、onServiceConnected() と onServiceDisconnected() を使用して ServiceConnection オブジェクトを作成します。また、クライアント Handler を作成し、それをクライアント Messenger オブジェクトに配置します。また、ServiceConnection オブジェクトの onServiceConnected() メソッドで配布される Messenger オブジェクトを取得するサービス Messenger オブジェクトも定義します。これですべてがセットアップされました。
アクティビティとサービスの間の Messenger 部分全体を削除し、ローカル バインダー オブジェクトのみを使用できると思います (アクティビティとサービスが同じ UI スレッドで実行されるため)。そうすれば、両側に 1 つのスレッドと、2 つのハンドラーと 2 つのメッセンジャーしかありません。同じスレッドに 2 つのハンドラー/メッセンジャーがあるのはなぜですか? それが非同期通信を取得する唯一の方法ですか? アクティビティから直接サービスのメソッドを呼び出したくありません (ローカルの Binder オブジェクトを使用して通常行うように)。これは同期通信であるためです。