讀書有感突然想寫一篇關于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來處理服務端發的消息)
到這裡總結完畢:
各位看官有什麼不清晰的地方,請給留言,大家一起交流謝謝!