Android IPC通信之Messenger

Messenger可以譯為信使,顧名思義,可以通過(guò)它在不同進(jìn)程中傳遞Message對(duì)象,在Message中放入我們需要傳遞的數(shù)據(jù),就可以輕松地實(shí)現(xiàn)數(shù)據(jù)的進(jìn)程間傳遞了。Messenger是一種輕量級(jí)的IPC方案,底層實(shí)現(xiàn)是AIDL,使用起來(lái)也很簡(jiǎn)單。首先需要在服務(wù)端進(jìn)程中創(chuàng)建一個(gè)Service來(lái)處理客戶端的連接請(qǐng)求,同時(shí)創(chuàng)建出一個(gè)Handler并通過(guò)它來(lái)創(chuàng)建一個(gè)Messenger對(duì)象,然后在Service的onBind中返回這個(gè)Messenger對(duì)象底層的Binder即可;接著在客戶端進(jìn)程中綁定服務(wù)端的Service,綁定成功后用服務(wù)端的IBinder對(duì)象創(chuàng)建出一個(gè)Messenger,通過(guò)這個(gè)Messenger就可以向服務(wù)端發(fā)送消息了,發(fā)消息類型為Message對(duì)象。如果需要服務(wù)端能夠回復(fù)客戶端,就和服務(wù)端一樣,還需要?jiǎng)?chuàng)建一個(gè)Handler并創(chuàng)建一個(gè)Messenger,并把這個(gè)Messenger對(duì)象通過(guò)Message的replyTo參數(shù)傳遞給服務(wù)端,服務(wù)端通過(guò)這個(gè)replyTo參數(shù)就可以回復(fù)客戶端。下面通過(guò)簡(jiǎn)單的例子來(lái)講解:

//服務(wù)端代碼,需要在AndroidManifest里面注冊(cè)服務(wù)
public class MessengerService extends Service {
    private static final String TAG = "MessengerService";
    //Handler處理客戶端發(fā)過(guò)來(lái)的消息
    private static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    Log.e(TAG,"receive msg fron client:"+msg.getData().getString("msg"));
                    //拿到客戶端Messenger對(duì)象,回復(fù)消息
                    Messenger client = msg.replyTo;
                    Message replyMessage = Message.obtain(null,1);
                    Bundle bundle = new Bundle();
                    bundle.putString("reply","okay, i have got you request");
                    replyMessage.setData(bundle);
                    try {
                        client.send(replyMessage);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.handleMessage(msg);
            }

        }
    }
    //創(chuàng)建Messenger對(duì)象,構(gòu)造函數(shù)如下
    //public Messenger(Handler target) {
    //    mTarget = target.getIMessenger();
    //}
    private final Messenger messenger = new Messenger(new MessengerHandler());

    //返回Messenger對(duì)象的底層Binder
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}
// 客戶端代碼
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private Messenger mService;
    //實(shí)例化ServiceConnection對(duì)象
    private ServiceConnection con = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //創(chuàng)建Messenger對(duì)象,構(gòu)造函數(shù)如下
            //public Messenger(IBinder target) {
            //mTarget = IMessenger.Stub.asInterface(target);
            //}
            mService = new Messenger(service);

            Message msg = Message.obtain(null,0);
            Bundle bundle = new Bundle();
            bundle.putString("msg","hello,this is from client");
            msg.setData(bundle);
            msg.replyTo = replyMessenger;
            try {
                mService.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    //Messenger對(duì)象接收服務(wù)端消息
    private Messenger replyMessenger = new Messenger(new MessengerHandler());

    private static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                Log.e(TAG,"receive msg fron server:"+msg.getData().getString("reply"));
            }
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this,MessengerService.class);
        bindService(intent,con, Context.BIND_AUTO_CREATE);
    }

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

如下為Messenger原理圖:


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

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