.簡介
Messenger,顧名思義即為信使,通過它可以在不同進程中傳遞Message對象,通過在Message中放入我們需要的入局,就可以輕松實現(xiàn)數(shù)據(jù)的跨進程傳遞了。Messenger是一種輕量級的IPC方案,其底層實現(xiàn)是AIDL。
Messenger的使用方法很簡單,它對AIDL進程了封裝,并且由于它一次只處理一個請求,因此在服務(wù)端我們不需要考慮同步的問題。
2.實現(xiàn)跨進程通信
1)服務(wù)端進程
首先我們需要在服務(wù)端創(chuàng)建一個Service來處理客戶端的連接請求,同時創(chuàng)建一個Handler并通過它來創(chuàng)建一個Messenger對象。然后在Service的onBind方法中返回這Messenger對象底層的Binder即可。
2)客戶端進程
客戶端進程中,首先需要綁定服務(wù)端的Service,綁定成功后用服務(wù)端返回的IBinder對象創(chuàng)建一個Messenger,并通過這個Messenger對象向服務(wù)端發(fā)送Message。此外,如果需要服務(wù)端響應(yīng)客戶端,我們就需要像服務(wù)端那樣創(chuàng)建一個Handler并創(chuàng)建一個新的Messenger,并把這個Messenger對象通過Message的replyTo參數(shù)傳遞給服務(wù)器,服務(wù)器就可以通過這個replyTo參數(shù)回應(yīng)客戶端了。
Messenger由于是在AIDL上進行了封裝,其使用過程相對比較簡單,下面的示例實現(xiàn)了客戶端發(fā)送消息給服務(wù)端,服務(wù)端會根據(jù)客戶端發(fā)送的消息予以回復(fù)并將回復(fù)的結(jié)果顯示在客戶端上。
3)下面直接貼上client和service的代碼,最后附上運行結(jié)果。
Client:package com.pignet.messengerdemo2;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity { private static TextView tvMsgFromService; Button btnSend; EditText etClient; private Messenger mService; private Messenger mGetReplyFromService =new Messenger(new MessengerHandler()); private static class MessengerHandler extends Handler{ @Override public void handleMessage(Message msg) { &