Android進(jìn)程間通信--Messenger

4.3 使用 Messenger 實(shí)現(xiàn)進(jìn)程間通信

Messenger 是一種輕量級的IPC通信機(jī)制.底層使用的是AIDL機(jī)制.
Messenger 一次只處理一個請求因此不存在線程同步的問題.
Messenger傳遞的數(shù)據(jù)類型是 : Message 對象.

構(gòu)造方法:

public Messenger(IBinder target) {
    mTarget = IMessenger.Stub.asInterface(target);
}
public Messenger(Handler target) {
    mTarget = target.getIMessenger();
}

實(shí)現(xiàn)Messenger的步驟 :

1, 服務(wù)端進(jìn)程

1, 創(chuàng)建一個Service來處理客戶端的請求.
2, 創(chuàng)建一個handler 用它來創(chuàng)建messenger對象.
3, 在Service的onBinder方法中返回這個Messenger底層的Binder對象即可.

2, 客戶端進(jìn)程

1, 綁定服務(wù)端的Service,綁定成功后用服務(wù)端返回的IBinder對象創(chuàng)建一個Messenger對象.
   通過這個Messenger就可以向服務(wù)端發(fā)送消息了.發(fā)送消息的類型為message 對象.
   
2, 如果需要服務(wù)端回復(fù)客戶端就需要創(chuàng)建一個Handler,利用這個Handler 創(chuàng)建一個Messenger對象.
   Messenger對象通過message 的 replyTo 參數(shù)傳遞給服務(wù)端.

3, 示例代碼

服務(wù)端關(guān)鍵代碼

/**
 * 服務(wù)端進(jìn)程.
 * Created by WSJ on 2016/9/29.
 */
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 MyConstants.MSG_FROM_CLIENT :
                    Log.i(TAG,"rec from client : " + msg.getData().getString("msg"));
                    // 回復(fù)客戶端
                    Messenger messenger = msg.replyTo;
                    Message message = Message.obtain(null,MyConstants.MSG_FROM_SERVICE);
                    Bundle data = new Bundle();
                    data.putString("msg","我已收到");
                    message.setData(data);
                    try {
                        messenger.send(message);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        // 返回Messenger底層的Binder對象.
        return mMessenger.getBinder();
    }
    // 根據(jù)Handler創(chuàng)建Messenger
    private final Messenger mMessenger = new Messenger(new MessengerHandler());
}

客戶端關(guān)鍵代碼

public class MessengerActivity extends AppCompatActivity {

    private static final String TAG = "MessengerActivity";
    /**
     * 向服務(wù)端發(fā)送數(shù)據(jù)的Messenger
     */
    private Messenger mService ;
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 根據(jù)獲得Binder創(chuàng)建Messenger對象
            mService = new Messenger(service);
            Message msg = Message.obtain(null,MyConstants.MSG_FROM_CLIENT);
            Bundle data = new Bundle();
            data.putString("msg","hello this is client !");
            msg.setData(data);
            // 將Messenger設(shè)置
            msg.replyTo = mReplyMessenger;
            try {
                mService.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

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

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

    private Messenger mReplyMessenger = new Messenger(new MessengerReplyHandler());
    /**
     * 接收服務(wù)端響應(yīng)的Handler
     */
    private static class MessengerReplyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case MyConstants.MSG_FROM_SERVICE :
                    Log.i(TAG,"reply from server : " + msg.getData().get("msg"));
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }
}

備注 : Android開發(fā)藝術(shù)探索

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容