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简要介绍和学习计划
关于上述哪错误的地方还请大家多多指正!
相关文章推荐
- xml转bean
- Android中<meta-data>的使用
- Android自定义View----1. 自定义自绘控件
- Android 中实现5.0按钮水波纹反馈效果
- Android  draw canvas save restore saveLayer 学习
- android屏幕适配
- Android平台Camera实时滤镜实现方法探讨(六)--创建帧缓存对象(FBO)加速实时滤镜处理
- Android应用 中英文切换
- Android:用Handler实现异步处理功能
- android mediaplayer 实现歌曲边播放边下载
- android学习笔记(七):Handler消息传递机制
- android开发之软键盘控制
- Android之View基础总结(View的事件体系一)
- Android开发周报:弹幕源码开放送
- android launcher3拖放功能深入剖析
- 【转载】Android样式的开发:View Animation篇
- Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)
- 给 Android 开发者的 RxJava 详解
- Android开发之Tools使用
- Android动画解析2-帧动画实现