[转]Messenger:使用消息的跨进程通信

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

 

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 编程模型

数据模型&#xff08;译&#xff09; image.png1 对象&#xff08;object&#xff09;、类型&#xff08;type&#xff09;和值&#xff08;value&#xff09; python中所有的数据都是通过对象&#xff08;object&#xff09;或者对象之间的关系来表示 每个对象&#xff08;obj…

R中统计假设检验总结(一)

先PS一个&#xff1a;考虑到这次的题目本身的特点 尝试下把说明性内容都直接作为备注写在语句中 另外用于说明的部分例子参考了我的教授Guy Yollin在Financial Data Analysis and Modeling with R这门课课件上的例子 部分参考了相关package的帮助文档中的例子 下面正题- 戌 >…

改造MUC实现Openfire群

我的Openfire群实现思路&#xff1a; 1、群和群成员&#xff0c;要保存到表中。 2、拉取群列表和群成员列表&#xff0c;均从DB中查询返回。 3、抛弃老外的“进房间&#xff0c;要发Presence ”。只要此人一上线&#xff0c;就模似一个Presence进行joinRoom&#xff0c;进入他的…

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

http://blog.csdn.net/whuancai/article/details/11994341 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 原文出自&#xff1a;http://blog.csdn.net/monkey_d_meng/article/details/5894910 尊重作者&#xff1a;MONKEY_D_MENG 最近一段时间&#xff0c;由…

14 Scroll 滚动搜索

Scroll的用法&#xff1a;第一次搜的时候&#xff0c;要指定 快照保留时间1min&#xff0c;分页的大小&#xff1a;2条/页&#xff1b;对于第一次搜索&#xff0c;ES会返回一个这个scroll的id&#xff1b;下次再搜的时候&#xff0c;就带着这个scrollid去搜就行了&#xff0c;不…

VS2008中使用JSONCPP方法小结

http://sourceforge.net/projects/jsoncpp/?sourcetyp_redirect C要使用JSON来解析数据&#xff0c;一般采用jsoncpp. 下载jsoncpp后&#xff0c;按ReadMe文档的说法是要先安装的&#xff0c;但是安装比较麻烦。然而事实上&#xff0c;我们并不需要安装&#xff0c;就可以直接…

如何在Windows下编译OpenSSL

OpenSSL是一个开源的第三方库&#xff0c;它实现了SSL&#xff08;Secure SocketLayer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;协议&#xff0c;被广泛企业应用所采用。对于一般的开发人员而言&#xff0c;在 http://slproweb.com/products/Win32Op…

《团队名称》第八次团队作业:Alpha冲刺day5

项目内容这个作业属于哪个课程2016计算机科学与工程学院软件工程(西北师范大学)这个作业的要求在哪里实验十二 团队作业8—软件测试与ALPHA冲刺团队名称快活帮作业学习目标 &#xff08;1&#xff09;掌握软件测试基础技术。 &#xff08;2&#xff09;学习迭代式增量软件开发过…

(转)C# 把我所积累的类库全部分享给博友(附件已经上传)

http://files.cnblogs.com/LsGW/Common.zip转载于:https://www.cnblogs.com/meetrice/archive/2012/01/02/2310428.html

前端的小图标获取

搜索iconfont&#xff0c;里面有很多图标&#xff0c;鼠标移到想要的图标上&#xff0c;然后点击一个类似购物车的图标&#xff0c;然后添加到项目&#xff0c;下载到本地&#xff0c;有一个使用指南的html&#xff0c;然后参照上面的改就好。 把下载好的.css和.eot文件拖到css…

$JavaScript(3)

41、渐进增强和优雅降级 渐进增强 &#xff1a;针对低版本浏览器进行构建页面&#xff0c;保证最基本的功能&#xff0c;然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。 优雅降级 &#xff1a;一开始就构建完整的功能&#xff0c;然后再针对低版本浏…

转:Yupoo(又拍网)的系统架构

Yupoo!&#xff08;又拍网&#xff09; 是目前国内最大的图片服务提供商&#xff0c;整个网站构建于大量的开源软件之上。以下为其使用到的开源软件信息&#xff1a; 操作系统&#xff1a;CentOS、MacOSX、Ubuntu 服务器&#xff1a;Apache、Nginx、Squid 数据库&#xff1a;…

浏览器搜索功能的使用

浏览器搜索功能的使用 直接在地址栏中搜索你需要的内容 用浏览器的搜索栏进行搜索 用双引号 " " 进行搜索 转载于:https://www.cnblogs.com/GaoNa/p/11061066.html

有趣的反直觉的“三门问题”

————— 第二天 ————— ———————————— 如何进行分析呢&#xff1f;我们不妨回到问题的起点&#xff0c;也就是参与者即将进行初次选择&#xff0c;主持人还没有打开一扇空门的时候。 从上图可以看出&#xff0c;我们总共面临着6种不同的子局面。这些子局面的…

转使用Moq让单元测试变得更简单

【ASP.Net MVC3 】使用Moq让单元测试变得更简单 前几天调查完了unity。现在给我的任务是让我调查Moq。 以下是自己找了资料&#xff0c;总结并实践的内容。如果有表述和理解错误的地方。恳请指正。 什么是Moq&#xff1f; Moq&#xff08;英语发音是Mock-you 或者只是mock&…

Web Service实现分布式服务的基本原理

简单的说&#xff0c; 就是客户端根据WSDL 生成 SOAP 的请求消息&#xff0c; 通过 HTTP 传输方式&#xff08;也可以是其它传输方式&#xff0c; 如 FTP 或STMP 等&#xff0c;目前 HTTP 传输方式已经成为 J2EE Web Service 的标准&#xff09;传给对方&#xff0c; 服务方实现…

使用docker部署mysql主从复制集群

一、环境搭建 虚拟机环境&#xff1a;centos7 IP:192.168.37.134 用户名&#xff1a;root 密码&#xff1a;123 启动3个容器&#xff0c;一个是master&#xff0c;端口是3307&#xff0c;另外两个是slaver&#xff0c;端口是3308和3309 docker pull mysql:5.7docker run -p …

特殊的质数肋骨

特殊的质数肋骨 时间限制: 0 Sec 内存限制: 128 MB题目描述 农民约翰的母牛总是生产出最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质…

学滑冰

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.cnr.cn/wcm/zhuanti/harb/bxyd/t20041230_163420.html 学滑冰&#xff08;一&#xff09; 到冰场上穿冰刀奔驰豪情一番&#xff0c;真是今人激情万千&#xff0c;你会滑冰吗&#xff1f;如果你还不会滑冰…

Java-Redis 热部署问题

项目请求时报错&#xff1a;java.lang.ClassCastException: cn.xingaohbd.seckil.model.User cannot be cast to cn.xingaohbd.seckil.model.User at cn.xingaohbd.seckil.service.impl.UserServiceImpl.getUser(UserServiceImpl.java:33) ~[classes/:na] at cn.xingaohbd.seck…