プロセス間通信のmessenger

9343 ワード

Messengerを使用してプロセス間通信を完了
Messengerはメッセージングに訳すことができるので、彼はプロセス間でmessageを伝達することができることを不思議に思って、私達はmessageの中でデータをカプセル化してmessengerを通じてプロセス間で伝達を完成することができて、messengerは1種の軽量級のIPC(プロセス間通信、プロセス間通信)方案で、AIDLの上層パッケージです
利点:使用が簡単で、呼び出しが便利で、同時が存在しない.彼はシリアル方式でクライアントデータを処理する弊害があるからだ.シリアル方式でクライアントデータを処理すると、一度に1つの要求しか処理できない.大量の同時要求があれば、彼も1つの処理しかできない.基本的にはメッセージの伝達にしか使用できない.プロセスをまたいでサービス側を呼び出す方法では使用できない.一般的にメッセージの伝達に使用される
使用:サービス側とクライアントに分けて使用します.次にDemoを使用して説明します.1.サービス側はまず、クライアントに接続するためのサービスを作成し、handlerとMessengerの関連付けを作成し、onBindメソッドでこのMessengerの最下位iBinderを返します.ここでMessengerの役割は、クライアントのデータをhandlerに渡して処理することです.注意サービス側は独立したプロセスで実行する、すなわちサービスのサービスはプロセス属性を宣言する.これは2つのアプリケーションを模倣してプロセス間通信を完了することに等しい.2.クライアントはサービス側のサービスをバインドする必要があり、バインドに成功したiBinderオブジェクトを通じてmessengerを作成し、このmessengerを通じてサービス側にデータを送信することができる.サービス側がクライアントにデータを返す必要がある場合は、クライアントにもHandlerとmessengerを作成し、このmessengerをmessageのreplyToパラメータを介してサービス側に渡す必要があります.サービス側はこのreplyToパラメータを通じてクライアントのmessengerを手に入れることができます.次に、コードの一目「鳥」を見てみましょう.
サービス側コード:
/*ipc messenger               */
public class MessengerService extends Service {

    private static final String TAG = "MessengerService";

    private static class messengerHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case Constants.MSG_FROM_CLIENT:
                    Log.d(TAG, "handleMessage : " + msg.getData().getString("msg"));
                    //replyTo       message   messenger,  messenger     handler                      
                    Messenger client = msg.replyTo;
                    //messenger    message         Parcelable           
                    Message replyMessage = Message.obtain(null, Constants.MSG_FROM_SERVICE);
                    //bundle                Parcelable message object    Parcelable    Object   ,        
                    Bundle data = new Bundle();
                    data.putString("msg", "        ");
                    replyMessage.setData(data);
                    try {
                        client.send(replyMessage);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    }

    // mseeengerHandler Messenger            mMessenger       
    private final Messenger mMessenger = new Messenger(new messengerHandler());

    @Override
    public IBinder onBind(Intent intent) {
        return mMessenger.getBinder();
    }
}

サービス側のサービスは独立したプロセスで実行する必要があるので、android:process=":remote"をリストに宣言します.
クライアントコード
/*ipc messenger      */
public class MessengerActivity extends AppCompatActivity {

    private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler());

    private static class MessengerHandler extends Handler {

        private static final String TAG = "MessengerService";

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case Constants.MSG_FROM_SERVICE:
                    Log.d(TAG, "handleMessage : " + msg.getData().getString("msg"));
                    break;
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = new Messenger(service);
            Message msg = Message.obtain(null, Constants.MSG_FROM_CLIENT);
            Bundle data = new Bundle();
            data.putString("msg", "        ");
            msg.setData(data);
            //    mGetReplyMessenger   replyTo            messenger          
            msg.replyTo = mGetReplyMessenger;
            try {
                mService.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    private Messenger mService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_messenger);
        //      service
        Intent intent = new Intent(this, MessengerService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mConnection);
    }
}

最後にクライアントとサービス側のインタラクティブlogを見てみましょう
08-22 09:17:01.797 4219-4219/? D/MessengerService: handleMessage :         
08-22 09:17:01.897 4206-4206/? D/MessengerService: handleMessage :