本文转自:http://xwangly.iteye.com/blog/1109424

Messenger:信使

官方文档解释:它引用了一个Handler对象,以便others能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message的通信(即两个进程间可以通过Message进行通信),在服务端使用Handler创建一个Messenger,客户端持有这个Messenger就可以与服务端通信了。

以前我们使用Handler+Message的方式进行通信,都是在同一个进程中,从线程持有一个主线程的Handler对象,并向主线程发送消息。

而Android既然可以使用bindler机制进行跨进行通信,所以我们当然可以将Handler与bindler结合起来进行跨进程发送消息。

查看API就可以发现,Messenger就是这种方式的实现。

一般使用方法如下:

1。远程通过

Java代码  
  1. mMessenger = new Messenger(mHandler)
mMessenger = new Messenger(mHandler)

创建一个信使对象

2。客户端使用bindlerService请求连接远程

3。远程onBind方法返回一个bindler

Java代码  
  1. return mMessenger.getBinder();
return mMessenger.getBinder();

4.客户端使用远程返回的bindler得到一个信使(即得到远程信使)

Java代码  
  1. public void onServiceConnected(ComponentName name, IBinder service) {
  2. rMessenger = new Messenger(service);
  3.         ......
  4. }
         public void onServiceConnected(ComponentName name, IBinder service) {rMessenger = new Messenger(service);......}

这里虽然是new了一个Messenger,但我们查看它的实现

Java代码  
  1. /**
  2. * Create a Messenger from a raw IBinder, which had previously been
  3. * retrieved with {@link #getBinder}.
  4. *
  5. * @param target The IBinder this Messenger should communicate with.
  6. */
  7. public Messenger(IBinder target) {
  8. mTarget = IMessenger.Stub.asInterface(target);
  9. }
    /*** Create a Messenger from a raw IBinder, which had previously been* retrieved with {@link #getBinder}.* * @param target The IBinder this Messenger should communicate with.*/public Messenger(IBinder target) {mTarget = IMessenger.Stub.asInterface(target);}

发现它的mTarget是通过Aidl得到的,实际上就是远程创建的那个。

5。客户端可以使用这个远程信使对象向远程发送消息:rMessenger.send(msg);

这样远程服务端的Handler对象就能收到消息了,然后可以在其handlerMessage(Message msg)方法中进行处理。(该Handler对象就是第一步服务端创建Messenger时使用的参数mHandler).

经过这5个步骤貌似只有客户端向服务端发送消息,这样的消息传递是单向的,那么如何实现双向传递呢?

首先需要在第5步稍加修改,在send(msg)前通过msm.replyTo = mMessenger将自己的信使设置到消息中,这样服务端接收到消息时同时也得到了客户端的信使对象了,然后服务端可以通过

Java代码  
  1. //得到客户端的信使对象,并向它发送消息
  2. cMessenger = msg.replyTo;
  3. cMessenger.send(message);
//得到客户端的信使对象,并向它发送消息
cMessenger = msg.replyTo;
cMessenger.send(message);

即完成了从服务端向客户端发送消息的功能,这样客服端可以在自己的Handler对象的handlerMessage方法中接收服务端发送来的message进行处理。

双向通信宣告完成。

下面改写ApiDemos工程实现Messenger通信

MessengerService.java

Java代码  
  1. package com.xwangly.apidemo.app;
  2. import java.util.Random;
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.Handler;
  6. import android.os.IBinder;
  7. import android.os.Message;
  8. import android.os.Messenger;
  9. import android.os.RemoteException;
  10. import android.util.Log;
  11. public class MessengerService extends Service {
  12. private String TAG = "MessengerService";
  13. @Override
  14. public void onDestroy() {
  15. // TODO Auto-generated method stub
  16. Log.i(TAG, "onDestroy");
  17. cMessenger = null;
  18. super.onDestroy();
  19. }
  20. @Override
  21. public boolean onUnbind(Intent intent) {
  22. // TODO Auto-generated method stub
  23. Log.i(TAG, "onUnbind");
  24. return super.onUnbind(intent);
  25. }
  26. static final int MSG_REGISTER_CLIENT = 1;
  27. static final int MSG_UNREGISTER_CLIENT = 2;
  28. static final int MSG_SET_VALUE = 3;
  29. private Random random = new Random();
  30. private Handler mHandler = new Handler() {
  31. @Override
  32. public void handleMessage(Message msg) {
  33. // TODO Auto-generated method stub
  34. Log.i(TAG, "handleMessage");
  35. switch (msg.what) {
  36. case MSG_SET_VALUE:
  37. try {
  38. Message message = Message.obtain(null,
  39. MessengerService.MSG_SET_VALUE);
  40. message.arg1 = random.nextInt(100);
  41. //得到客户端的信使对象,并向它发送消息
  42. cMessenger = msg.replyTo;
  43. cMessenger.send(message);
  44. } catch (RemoteException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48. break;
  49. default:
  50. super.handleMessage(msg);
  51. }
  52. }
  53. };
  54. /**
  55. * 自己的信使对象
  56. */
  57. private Messenger mMessenger = new Messenger(mHandler);
  58. /**
  59. * 客户的信使
  60. */
  61. private Messenger cMessenger;
  62. @Override
  63. public IBinder onBind(Intent intent) {
  64. // TODO Auto-generated method stub
  65. Log.i(TAG, "onBind");
  66. //返回自己信使的bindler,以供客户端通过这个bindler得到服务端的信使对象(通过new Messenger(bindler))
  67. return mMessenger.getBinder();
  68. }
  69. @Override
  70. public void onRebind(Intent intent) {
  71. // TODO Auto-generated method stub
  72. Log.i(TAG, "onRebind");
  73. }
  74. }
package com.xwangly.apidemo.app;import java.util.Random;import android.app.Service;
import android.content.Intent;
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 {private String TAG = "MessengerService";@Overridepublic void onDestroy() {// TODO Auto-generated method stubLog.i(TAG, "onDestroy");cMessenger = null;super.onDestroy();}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubLog.i(TAG, "onUnbind");return super.onUnbind(intent);}static final int MSG_REGISTER_CLIENT = 1;static final int MSG_UNREGISTER_CLIENT = 2;static final int MSG_SET_VALUE = 3;private Random random = new Random();private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubLog.i(TAG, "handleMessage");switch (msg.what) {case MSG_SET_VALUE:try {Message message = Message.obtain(null,MessengerService.MSG_SET_VALUE);message.arg1 = random.nextInt(100);//得到客户端的信使对象,并向它发送消息cMessenger = msg.replyTo;cMessenger.send(message);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;default:super.handleMessage(msg);}}};/*** 自己的信使对象*/private Messenger mMessenger = new Messenger(mHandler);/*** 客户的信使*/private Messenger cMessenger;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubLog.i(TAG, "onBind");//返回自己信使的bindler,以供客户端通过这个bindler得到服务端的信使对象(通过new Messenger(bindler))return mMessenger.getBinder();}@Overridepublic void onRebind(Intent intent) {// TODO Auto-generated method stubLog.i(TAG, "onRebind");}}

MessengerServiceActivities.java

Java代码  
  1. package com.xwangly.apidemo.app;
  2. import com.xwangly.apidemo.R;
  3. import android.app.Activity;
  4. import android.content.ComponentName;
  5. import android.content.Intent;
  6. import android.content.ServiceConnection;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.IBinder;
  10. import android.os.Message;
  11. import android.os.Messenger;
  12. import android.os.RemoteException;
  13. import android.util.Log;
  14. import android.view.View;
  15. import android.widget.TextView;
  16. public class MessengerServiceActivities {
  17. public static class Binding extends Activity implements
  18. View.OnClickListener {
  19. private String TAG = "Binding";
  20. TextView mCallbackText;
  21. private boolean isBound;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. // TODO Auto-generated method stub
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.messenger_service_binding);
  27. findViewById(R.id.bind).setOnClickListener(this);
  28. findViewById(R.id.unbind).setOnClickListener(this);
  29. mCallbackText = (TextView) findViewById(R.id.callback);
  30. mCallbackText.setText("Not attached.");
  31. }
  32. private Handler mHandler = new Handler() {
  33. @Override
  34. public void handleMessage(Message msg) {
  35. Log.i(TAG, "handleMessage");
  36. switch (msg.what) {
  37. case MessengerService.MSG_SET_VALUE:
  38. mCallbackText.setText("Received from service: " + msg.arg1);
  39. break;
  40. default:
  41. super.handleMessage(msg);
  42. }
  43. }
  44. };
  45. /**
  46. * 自己的信使
  47. */
  48. private Messenger mMessenger;
  49. /**
  50. * 远程服务的信使
  51. */
  52. private Messenger rMessenger;
  53. private ServiceConnection connection = new ServiceConnection() {
  54. public void onServiceConnected(ComponentName name, IBinder service) {
  55. // TODO Auto-generated method stub
  56. Log.i(TAG, "onServiceConnected");
  57. rMessenger = new Messenger(service);
  58. mMessenger = new Messenger(mHandler);
  59. sendMessage();
  60. }
  61. public void onServiceDisconnected(ComponentName name) {
  62. // TODO Auto-generated method stub
  63. rMessenger = null;
  64. }
  65. };
  66. public void onClick(View v) {
  67. // TODO Auto-generated method stub
  68. Intent intent = new Intent(
  69. "com.xwangly.apidemo.app.messenger_service");
  70. switch (v.getId()) {
  71. case R.id.bind:
  72. if (!isBound) {
  73. isBound = bindService(intent, connection, BIND_AUTO_CREATE);
  74. //isBound = true;
  75. }else {
  76. sendMessage();
  77. }
  78. break;
  79. case R.id.unbind:
  80. if (isBound) {
  81. unbindService(connection);
  82. isBound = false;
  83. }
  84. break;
  85. default:
  86. break;
  87. }
  88. }
  89. /**
  90. * 使用服务端的信使向它发送一个消息。
  91. */
  92. private void sendMessage() {
  93. // TODO Auto-generated method stub
  94. Message message = Message.obtain(null, MessengerService.MSG_SET_VALUE);
  95. message.replyTo = mMessenger;
  96. try {
  97. rMessenger.send(message);
  98. } catch (RemoteException e) {
  99. // TODO Auto-generated catch block
  100. e.printStackTrace();
  101. }
  102. }
  103. }
  104. }
package com.xwangly.apidemo.app;import com.xwangly.apidemo.R;import android.app.Activity;
import android.content.ComponentName;
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.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.TextView;public class MessengerServiceActivities {public static class Binding extends Activity implementsView.OnClickListener {private String TAG = "Binding";TextView mCallbackText;private boolean isBound;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.messenger_service_binding);findViewById(R.id.bind).setOnClickListener(this);findViewById(R.id.unbind).setOnClickListener(this);mCallbackText = (TextView) findViewById(R.id.callback);mCallbackText.setText("Not attached.");}private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {Log.i(TAG, "handleMessage");switch (msg.what) {case MessengerService.MSG_SET_VALUE:mCallbackText.setText("Received from service: " + msg.arg1);break;default:super.handleMessage(msg);}}};/*** 自己的信使*/private Messenger mMessenger;/*** 远程服务的信使*/private Messenger rMessenger;private ServiceConnection connection = new ServiceConnection() {public void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubLog.i(TAG, "onServiceConnected");rMessenger = new Messenger(service);mMessenger = new Messenger(mHandler);sendMessage();}public void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubrMessenger = null;}};public void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent("com.xwangly.apidemo.app.messenger_service");switch (v.getId()) {case R.id.bind:if (!isBound) {isBound = bindService(intent, connection, BIND_AUTO_CREATE);//isBound = true;}else {sendMessage();}break;case R.id.unbind:if (isBound) {unbindService(connection);isBound = false;}break;default:break;}}/*** 使用服务端的信使向它发送一个消息。*/private void sendMessage() {// TODO Auto-generated method stubMessage message = Message.obtain(null, MessengerService.MSG_SET_VALUE);message.replyTo = mMessenger;try {rMessenger.send(message);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

AndroidManifest.xml相关配置如下:

Xml代码  
  1. <service android:name=".app.MessengerService" >
  2. <intent-filter>
  3. <action android:name="com.xwangly.apidemo.app.messenger_service" />
  4. </intent-filter>
  5. </service>
  6. <activity android:name=".app.MessengerServiceActivities$Binding"
  7. android:label="@string/activity_messenger_service_binding"
  8. android:launchMode="singleTop">
  9. <intent-filter>
  10. <action android:name="android.intent.action.MAIN" />
  11. <category android:name="android.intent.category.LAUNCHER" />
  12. </intent-filter>
  13. </activity>
     <service android:name=".app.MessengerService" ><intent-filter><action android:name="com.xwangly.apidemo.app.messenger_service" /></intent-filter></service><activity android:name=".app.MessengerServiceActivities$Binding"android:label="@string/activity_messenger_service_binding"android:launchMode="singleTop"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

至于layout就不帖了,两个按钮一个文本域。

转载于:https://www.cnblogs.com/freeliver54/archive/2011/12/27/2303790.html

[转]Messenger:使用消息的跨进程通信相关推荐

  1. Android 使用Messenger和Aidl实现跨进程通信

    Android Messenger和Aidl的使用 1.怎么使用多进程 为安卓的四大组件设置process属性值 例如:android:process=":test"或者 andr ...

  2. Android跨进程通信一 Messenger

    实现客户端与服务端之间的交互 说明:         Messenger是信使的意思,从它的名字就可以了解到它充当着信差的角色.Android通过它实现跨进程通信,主要有客户端信使与服务端信使两种角色 ...

  3. 利用Messenger跨进程通信

    在进行跨进程通信的时候,可能很多开发者一开始想到的就是AIDL.AIDL,中文名称是android接口描述语言,是android系统中用于进行跨进程通信必须了解的.至于如何生成远程对象进行AIDL通信 ...

  4. Android的跨进程通信

    Android系统的跨进程简介 为什么不能直接跨进程通信? 为了安全考虑,应用之间的内存是无法互相访问的,各自的数据都存在于自身的内存区域内. 如何跨进程通信? 要想跨进程通信,就要找到一个大家都能访 ...

  5. Android IPC 进程进程间通信或跨进程通信

    Android IPC 机制 老话长谈,趁现在有时间对IPC做一个具体的总结. IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间 ...

  6. Android跨进程通信

    一 多进程之间的通信 由于不同进程所拥有的地址是两块不同的地址空间,所以不能直接通过共享内存共享数据了. Linux常用跨进程通信方式:管道,信号量,共享内存,socket Android常用跨进程通 ...

  7. 使用AIDL+动态代理+运行时注解+反射 反手撸一套Android跨进程通信框架

    IPC 前言 跨进程通信方式 跨进程通信框架 涉及到的技术 使用Request-Response思想 IPCRequest IPCResponse RemoteService 服务端 客户端 附带 项 ...

  8. Binder跨进程通信原理(一):动态内核加载模块

    先上一张Binder 的工作流程图.(如果不清晰,可以 复制图片链接到浏览器 或 保存到本地 查看,我经常都是这样看图的哈) 一开始上手,陌生的东西比较多,But,其实并不复杂.喔,流程图是用 Pro ...

  9. 【朝花夕拾】Android跨进程通信总结篇

    前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...

最新文章

  1. sqlplusw下登录sys账户
  2. 牛客题霸 SQL1 查找最晚入职员工的所有信息
  3. OpenCV兼容性测试的实例(附完整代码)
  4. hdu 4277 USACO ORZ
  5. 作者:邢俊峰(1985-),男,烟台中科网络技术研究所研发工程师。
  6. 数据科学的原理与技巧 一、数据科学的生命周期
  7. 定制你的Unity编辑器
  8. python_PDF合成软件_ZHOU125disorder_
  9. 2进制转16进制c语言库函数,单片机 avr c语言 二进制 十进制 十六进制 快速转换...
  10. 游标CURSOR的基本用法
  11. Ubuntu20.04使用清华源下载Qt
  12. 读入一句话(一行文本),统计26个大写字母各自出现的次数。(java)
  13. ShowDown.js MD 转HTML 时的问题
  14. Final Cut Pro X 精选插件合集!
  15. cv面试百问day2
  16. mysql 查询名字包括下划线_Python 之 MySql 每日一练 329——查询名字中含有风字的学生信息...
  17. python控制程序_Python 流程控制
  18. Large-scale cluster management at Google with Borg
  19. 2019最新Android常用开源库总结(持续更新,建议收藏)
  20. 关于人体血液循环的猜想

热门文章

  1. c语言中调试时go的作用,C语言调用GO
  2. java 写文件 属性吗_使用JAVA读写Properties属性文件
  3. php hbase thrift,PHP使用Thrift操作Hbase
  4. linux php oauth安装,Linux php 扩展安装 mongo ,redis ,soap,imap,pdo_mysql,oauth
  5. php qq接收不了,php imap接收qq邮件的问题
  6. linux下tomcat6.0与jdk安装详细步骤
  7. 2020年mysql中级课程一天一小时
  8. elasticsearch的Linux下安装报错问题解决
  9. PaperNotes(15)-图神经网络、PyG极简版入门笔记
  10. Windows的命令行窗口运行Python时,如何清屏?