Messenger 是一个轻量级的IPC方案,其封装使用AIDL,使其简便进行进程间的通信。
服务端:
1,创建一个Service,
2,同时创建一个Handler
3,并通过它进行创建 Messenger对象。
4,在Service的onBind 方法中返回 Messenger对象底层 Bindler即可。
5,如果需要返回信息给客户端,则需要利用 handlerMessage 方法里 Messenger对象(客户端将其保存msg.replyTo中)进行发送 Message。
package com.yufen.android_application_damo.IPC.Messenger;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
//服务端进程
public class MessengerService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return mMessenger.getBinder();//返回Messenger的Binder
}
//创建一个Messenger
private final Messenger mMessenger = new Messenger(new MessengerHandler());
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case MyConstants.MSG_FROM_CLIENT:
/*****处理客户端进程的信息******/
Log.d("yufen/MessengerService", "receive message from client: " + msg.getData().getString("msg"));
/*****返回给客户端的信息******/
//创建Message载体
Message replyMessage = Message.obtain(null, MyConstants.MSG_FROM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString("reply", "Service: Nice to meet you too!");
replyMessage.setData(bundle);
Messenger clien = msg.replyTo;
try {
clien.send(replyMessage);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
}
}
}
}
客户端:
1,进行绑定服务端 Service;利用绑定成功后返回的 IBinder 创建一个Messenger对象;
2,通过该 Messenger 对象,我们就可以进行发送 Message类型的信息(Message通过setData(Bundle in)可发送Bundle信息);
3,如果需要接收服务端返回的信息,则需要与服务端一样创建一个 Handler 对象和 Messenger 对象。并把这个 Messenger对象 通过Message.replyTo参数传递给服务端,这样服务端将可以通过它来返回信息给客户端。
package com.yufen.android_application_damo.IPC.Messenger;
import com.yufen.android_application_damo.R;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.util.Log;
//客户端进程
public class MessengerActivity extends Activity {
private Messenger mMessenger;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
mMessenger = new Messenger(arg1);//利用其IBinder对象创建Messenger
sendMessageToService(mMessenger, mGetReplyMessenger);
}
};
private void sendMessageToService(Messenger sendMessenger, Messenger replyMessenger){
Message msg = Message.obtain(null, MyConstants.MSG_FROM_CLIENT);
Bundle data= new Bundle();
data.putString("msg", "Client: Hello...I am from the Messenger Activity, Nice to meet you!");
msg.setData(data);//向服务端进程发送消息,消息类型只能Message对象
//传递 Messenger 给服务端,服务端利用该Messages进行回复信息。
msg.replyTo = replyMessenger;
try {
mMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(getApplicationContext(), MessengerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);//绑定Service
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unbindService(mConnection);
}
//创建一个 Messenger来接收来自服务器的信息
private Messenger mGetReplyMessenger = new Messenger(new MessengerHander());
private class MessengerHander extends Handler {
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case MyConstants.MSG_FROM_SERVICE:{
Bundle bun = msg.getData();
Log.d("yufen","Service: " + bun.getString("reply"));
break;
}
default:
super.handleMessage(msg);
}
}
}
}
由于我们在 一个App里模仿进程间的通信,因此对Service设置为另外一个独立进程:
<service
android:name=".IPC.Messenger.MessengerService"
android:process=":remote"></service>