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

Android Messenger简单的跨进程通信

2015-12-04 16:47 633 查看

Messenger的定义

Reference to a Handler, which others can use to send messages to it.This allows for the implementation of message-based communication across processes, by creating a Messenger pointing to a Handler in one process,and handing that Messenger to another process.

我用比较菜的英语翻一下,大致的意思说的是有一个名叫A的Messenger的家伙引用一个Handler对象,其他的B,C,D的Messenger可以使用这个Handler对象发消息给A的Messenger。它可以基于消息进行跨进程的通信。

If you need to be able to write a Service that can perform complicated communication with clients in remote processes (beyond simply the use of Context.startService to send commands to it), then you can use the Messenger class instead of writing full AIDL files.

上述是Service介绍中的一段,如果你需要和其他进程中的客户端进行通信,那么你可以使用Messenger类代替AIDL文件的编写。由此可见相比较AIDL它实现起来更简单一些。


Client端实现(代码片段)

//首先我们定义一个和Messenger绑定的handler
private Handler remoteHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 100:
Toast.makeText(ScrollingActivity.this, "receive message", Toast.LENGTH_LONG).show();
break;
}
}
};
//定义一个和handler绑定的Messenger
private Messenger messenger = new Messenger(remoteHandler);
//定义一个和Service通讯的Messenger
private Messenger serviceMessenger;

//绑定远程service
private void bindService() {
Intent intent = new Intent();
try {
//获得其他进程的上下文
Context serviceContext = createPackageContext("com.xxx.sservice",
Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);
//指定要绑定的service
intent.setClassName(serviceContext, "com.xxx.sservice.MyService");
//绑定
bindService(intent, connection, Context.BIND_AUTO_CREATE);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}

//绑定后的回调函数
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//当和远程service建立连接后,通过IBinder service我们可以建立和远程service互动的Messenger
//IBinder的service对象是绑定的service中onBind()方法返回的对象
serviceMessenger = new Messenger(service);
Message msg = new Message();
msg.what = 101;
//远端利用设置的replyTo的messenger发送消息
msg.replyTo = messenger;
try {
serviceMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}

}

@Override
public void onServiceDisconnected(ComponentName name) {

}
};


Service端实现(代码片段)

//创建一个service并启动
public class MyService extends Service {
private Handler remoteHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 101:
try {
Toast.makeText(MyService.this, "Service Receive", Toast.LENGTH_SHORT).show();
Message clientMsg = new Message();
clientMsg.what = 100;
msg.replyTo.send(clientMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
};

private Messenger messenger = new Messenger(remoteHandler);

@Override
public IBinder onBind(Intent intent) {
//返回给客户端的IBinder
return messenger.getBinder();
}

@Override
public void onCreate() {
super.onCreate();

}
}


总结

Messenger实际上和我们经常使用的AIDL一样都是基于Binder机制,只不过是使用Messenger省略了自定义的AIDL,Messenger本身实现了一个IMessenger的AIDL,利用常使用的Handler进行传递消息,可能这样会更好接受一些。

关于进程间通信的Binder机制可看下老罗写的一系列文章Android进程间通信(IPC)机制Binder简要介绍和学习计划

关于上述哪错误的地方还请大家多多指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: