サービスとComponent通信


サービスはAndroid Componentコンポーネントにバインドされており、その通信方式は一般的に次の3つです.
1.onBind(Intent intent)でBinderオブジェクトを返します.このインタフェースでServiceと対話します.
2.IBinderオブジェクトからMessengerを作成し、HandlerでServiceと対話する
3.AIDLによるインタラクション
第1のBinderを返す方法は、Binderで直接サービスインスタンスを返すことができ、Componentが直接サービスと通信できるため、最も便利です.
しかし、サービスとComponentが同じプロセスにある場合にのみBinder方式で行うことができるという限界があり、このサービスがプログラム内で使用されている場合、この方式が優先的な通信方式である.
複数のComponentが同じServiceにバインドされている場合、システムは最初のComponentがバインドされているときにonBindメソッドを呼び出すだけで、他のComponentはバインドされているときに、最初に返されたBinder、すなわち、複数のコンポーネントが同じBinderを使用していることに注意してください.
異なるプロセス間でBinderを戻そうとすると、タイムアウトが実行されます.
2つ目は、1つのMessengerによるインタラクションで、Messengerの作成と使用は簡単です.以下のようにします.

    
    // Service 
    @Override
    public IBinder onBind(Intent arg0) {
        return mMessenger.getBinder();
    }
    
    private Messenger mMessenger = new Messenger(new HelloHandler());

    class HelloHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
            super.handleMessage(msg);
        }
    }

    // Activity 
    private Messenger mMessenger ;
    private ServiceConnection sc = new ServiceConnection(){

        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i(TAG, "    ");
            mMessenger = new Messenger(service);
            mBound = true;
        }

        public void onServiceDisconnected(ComponentName name) {
            Log.i(TAG, "    ");
            mBound = false;
        }
    };

これにより、メッセージを送信することでサービスとコミュニケーションすることができます.Messengerの利点は、サービスとComponentが異なるプロセスにあるときに通信できることです.これはBinder方式ではできません.Messengerの下部はAIDLで実現されています.
一般的に、最初の2つはほとんどのプログラムのニーズを満たすことができ、同時処理のサービスを行う場合は、AIDLを使用して実現する必要があります.具体的には、http://developer.android.com/guide/developing/tools/aidl.html