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原理圖: