天天看點

android 程序間通信值Messenger

讀書有感突然想寫一篇關于Messager的部落格,記錄一下筆者對android程序通信Messenger的使用的梳理

程序間通信最經典的就是client和Service之間的通信了,那麼首先我們就來建立一個這樣的模型來進行Messenger的學習和梳理

建立一個android工程,建立一個MainActivity.java 和一個Service,并在清單檔案中配置Service運作在一個獨立的remote程序中清單檔案配置代碼如下:

<service
            android:name=".MessengerService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote">
        </service>
           

下面就來看一下我們在服務裡具體做了什麼?我們在服務裡做了三件事

1.建立一個Handler對象

2.建立Messager信使對象,并将服務的handler交給Messager信使

3.通過IBind的onBind(Intent intent )方法将服務的Messenger信使傳回出去

具體代碼如下

private static class MessengerHandler extends  Handler{
    @Override
    public void handleMessage(Message msg) {

        super.handleMessage(msg);
    }
}

    private final Messenger messenger = new Messenger(new MessengerHandler());

    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
//        throw new UnsupportedOperationException("Not yet implemented");
    }
           

好了,接下來我們來看一下client這邊做了什麼操作

用戶端這邊做了五件事

1.綁定服務

2.在服務的onServiceConnection裡面拿到服務那邊傳回的Messenger信使對象

3.建立一個消息Message

4.建立一個用戶端的Messenger并把他交給Message

5.然後讓服務那邊的Messenger把消息發送給服務端

具體代碼如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //通過Intent綁定服務
        Intent intent = new Intent(this, MessengerService.class);
        myConnection = new MyConnection();
        //第一步:綁定服務
        bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
        startService(intent);
    }

    private class MyConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //第二步:獲得服務那邊傳回出來的Messenger
            mMessengerFromService = new Messenger(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    //第三步:建立一個用戶端的信使ClientMessenger
    private Messenger ClientMessenger = new Messenger(new ClientHandler());

    public void send(View view){
        Log.d(TAG,"向服務發送消息");
        //第四步:建立一個消息對象
        Message message = Message.obtain(null,Constant.MSG_FROM_CLIENT);
        Bundle data = new Bundle();
        data.putString("msg","hello,this is a message from client");
        message.setData(data);
        //第五步:将用戶端的信使放到消息上
        message.replyTo = ClientMessenger;
        try {
            //第六步:通過服務端的信使将消息發送給服務端
            mMessengerFromService.send(message);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }





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

通過上面的send方法,我們通過服務那邊的信使給服務發送了一條消息,這消息上攜帶了消息的内容和用戶端的信使

下面我們就到服務那邊來處理一下這個消息,服務的信使綁定了服務那邊的ServiceHandler,是以我們通過他來處理消息

private static class ServiceHandler extends  Handler{
    @Override
    public void handleMessage(Message msg) {
        //第一步:獲得用戶端那邊的信使clientMessenger;
        mClientMessenger = msg.replyTo;
        switch (msg.what){
            //第二步:處理用戶端發來的消息内容
                case Constant.MSG_FROM_CLIENT:
                    Log.d(TAG,"receive message from client"+ msg.getData().getString("msg"));
                    //第三步:通過用戶端的信使給用戶端發一個消息;
                    sendBackToClient(Constant.MSG_FROM_SERVICE);
                    break;
                default:
                    super.handleMessage(msg);
            }
    }
        //通過用戶端的信使給用戶端發消息
        private  void sendBackToClient(int what) {
            try {
                if(mClientMessenger == null)
                    return;
                Message message = Message.obtain(null,what);
                Bundle bundle = new Bundle();
                bundle.putString("msg","你好client,這是來自服務端的問候");
                message.setData(bundle);
                mClientMessenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
}
           

OK到目前為止,流程全部走完

總結如下:

用戶端:

1.client通過綁定服務獲得服務那邊的ServiceMessenger服務信使

2.client建立一個消息,和一個clientMessenger用戶端的信使,并将用戶端的信使綁定到消息上

3.讓服務的信使吧用戶端建立的消息發送給服務端

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------

服務端:

1.建立一個服務端的ServiceMessenger,并在用戶端和服務端綁定的時候将他通過IBinder傳回給用戶端

(用戶端就是通過這個服務端的信使來給服務端發消息的)

2.使用ServiceMessenger綁定的ServiceHandler來處理用戶端發來的消息:

a.首先獲得用戶端消息攜帶的一個信使(就是通過用戶端的這個ClientMessenger來給用戶端發消息);

b.獲得用戶端發來消息的詳細内容,并通過獲得的用戶端的信使,來給用戶端一個回音(用戶端的信使綁定的用戶端的ClientHandler來處理服務端發的消息)

到這裡總結完畢:

各位看官有什麼不清晰的地方,請給留言,大家一起交流謝謝!

繼續閱讀