您的位置:首页 > 移动开发 > Android开发

Android 跨进程通信--Messenger

2016-07-11 13:38 423 查看
通过Messenger可以在不同的进程中传递Message,Messenger是一个轻量级的IPC方案,他的底层实现是AIDL。

下面是服务端与客户端实现的代码,主要实现了两个进程简单的相互通信:

服务端:

public class MessengerService extends Service {

private static final String Tag = "MessengerService";

private static final int MSG_FROM_CLIENT = 1;

private static final int MSG_FROM_SERVICE = 2;

private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_CLIENT:
// 客户端发来的信息
Log.i(Tag, "msg from client : " + msg.getData().getString("msg"));
// 回复客户端
Messenger client = msg.replyTo;
Message replyMessage = Message.obtain(null, MSG_FROM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString("reply", "消息收到,稍后回复");
replyMessage.setData(bundle);
try {
client.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
break;
}

}
}

private final Messenger mMessenger = new Messenger(new MessengerHandler());

@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}

}

客户端:
public class MainActivity extends Activity {
private static final String Tag = "MainActivity";

private static final int MSG_FROM_CLIENT = 1;

private static final int MSG_FROM_SERVICE = 2;

private Messenger mService;

private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler());

private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROM_SERVICE:
Log.i(Tag,"msg from service : " + msg.getData().getString("reply"));
break;
default:
super.handleMessage(msg);
break;
}
}
}

private ServiceConnection conn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName className) {
mService = null;
}

@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mService = new Messenger(service);
Message msg = Message.obtain(null, MSG_FROM_CLIENT);
Bundle data = new Bundle();
data.putString("msg", "hello messenger~");
msg.setData(data);
// 客户端发送信息时,需要把接收服务端会的Messenger通过Message的replyTo参数传递给服务端
msg.replyTo = mGetReplyMessenger;
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}

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

}

注意service要在AndroidManifest.xml中注册:
<service
android:name="com.example.messagertestapplication.MessengerService"
android:process=":remote" >
</service>

结果:



Messenger工作原理图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: