使用Messenger:

Messenger 可以在不同的进程传递 Message 对象,而我们可以在 Message 对象中放入我们所需要的数据,这样就能实现进程间通信了。首先我们来看一个图了解一下:

由图可以看出,我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。

以下是如何使用Messenger的步骤:

服务端接收客户端数据:

1. Service需要实现一个Hanlder,用以处理从客户端收到的消息

2.用该Handler创建一个Messenger对象,Messenger对象内部会引用该Handler对象

3. 用创建好的Messenger对象获得一个IBinder实例,并且将该IBinder通过Service的onBind方法返回给各个客户端

客户端向服务端发送数据:

4. 客户端通过收到的IBinder对象实例化一个Messenger对象,该Messenger内部指向Service中的Handler。客户端通过该Messenger对象就可以向Service中的Hanlder发送消息。

5. Service中的Hanlder收到消息后,在Handler中的handleMessage方法中处理消息。

6. 通过上面的第4步与第5步,就完成了客户端向Service发送消息并且Service接收到消息的单向通信过程,即客户端 -> Service。

如果要实现Service向客户端回消息的通信过程,即Service -> 客户端,那么前提是在客户端中也需要像Service一样内部维护有一个指向Handler的Messenger。当在第4步中客户端向Service发送信息时,将Message的replyTo属性设置为客户端自己的Messenger。这样在第5步Service在Handler的handleMessage中处理收到的消息时,可以通过Message的Messenger再向客户端发送Message,这样客户端内维护的Handler对象就会收到来自于Service的Message,从而完成Service向客户端发送消息且客户端接收到消息的通信过程。

具体实例:

1)服务端代码:

public class MessengerService extends Service {private static final String TAG = "MessengerService";// 消息处理messengerHandler,处理来自客户端的消息private ServiceMessengerHandler messengerHandler = new ServiceMessengerHandler();// 指向handler的服务端Messengerprivate Messenger mServiceMessenger = new Messenger(messengerHandler);public MessengerService() {}@Overridepublic IBinder onBind(Intent intent) {return mServiceMessenger.getBinder();}public static class ServiceMessengerHandler extends Handler{@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);// 取出客户端的消息内容Bundle clientBundle = msg.getData();String clientMessage = clientBundle.getString("client");Log.i(TAG, "客户端的消息是:" + clientMessage);// 新建一个Message对象,作为回复客户端的对象(Service回复的消息)Message serviceToClientMsg = Message.obtain();Bundle serviceBundle = new Bundle();serviceBundle.putString("service", "你好,客户端很高兴认识你!");serviceToClientMsg.setData(serviceBundle);// 获取客户端携带过来的Messenger对象Messenger mClientMessenger = msg.replyTo;try {// 回复消息给客户端
                mClientMessenger.send(serviceToClientMsg);} catch(RemoteException e) {e.printStackTrace();}}}
}

2)客户端代码

public class MessengerActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "MessengerActivity";// 客户端的消息处理器private ClientMessengerHandler clientMessengerHandler = new ClientMessengerHandler();// 指向handler的客户端的Messengerprivate Messenger mClientMessenger = new Messenger(clientMessengerHandler);private static class ClientMessengerHandler extends Handler {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);Bundle serviceBundle = msg.getData();String serviceMessage = serviceBundle.getString("service");Log.i(TAG, "服务端回复的消息是:" + serviceMessage);}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_messenger);}public void onClick(View v) {switch (v.getId()) {case R.id.bindService:Intent intent = new Intent(this, MessengerService.class);bindService(intent, mConnection, BIND_AUTO_CREATE);break;case R.id.unBindService:unbindService(mConnection);break;default:break;}}private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {// 获取服务端关联的Messenger对象Messenger mServiceMessenger = new Messenger(iBinder);// 创建客户端向服务端传递消息的MessageMessage clientToServiceMsg = Message.obtain();Bundle clientBundle = new Bundle();clientBundle.putString("client", "你好,服务器,我是客户端!");clientToServiceMsg.setData(clientBundle);// 在message中添加一个服务端回复客户端的客户端Messenger对象clientToServiceMsg.replyTo = mClientMessenger;try {mServiceMessenger.send(clientToServiceMsg);} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}};@Overrideprotected void onDestroy() {super.onDestroy();}
}

(3)客户端布局文件

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MessengerActivity"><Buttonandroid:id="@+id/bindService"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/unBindService"android:layout_width="match_parent"android:layout_height="wrap_content" /></androidx.constraintlayout.widget.ConstraintLayout>

转载于:https://www.cnblogs.com/yanglanwan/p/11301320.html

Android之基于message的进程间通信Messenger相关推荐

  1. Android 基于Message的进程间通信 Messenger完全解析

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47017485: 本文出自:[张鸿洋的博客] 一.概述 说到Android进程间 ...

  2. Android进程间通信 Messenger详解

    1. 概念 Messenger,即进程间通信的信使.它是基于Message的进程间通信,我们可以像在线程间利用Handler.send(Message)一样. Messenger是一种轻量级的IPC方 ...

  3. 详细讲解Android中的Message的源码

    相信大家对于Android中的Handler是在为熟悉不过了,但是要知道,Handler就其本身而言只是一个壳子,真正在内部起到作用的是Message这个类,对于Message这个类,相信大家也不会陌 ...

  4. Android是基于Linux的开源操作系统也是Linux内核

    Android是基于Linux的开源操作系统也是Linux内核 亿仁网 发布时间: 18-08-2023:46山西亿仁电子商务官方帐号 Android是基于Linux的开源操作系统,主要用于嵌入式设备 ...

  5. Android Studio基于mob的短信验证

    Android Studio 基于mob平台提供的SMSSDK实现注册后绑定手机号的学习笔记 将mob提供的SMSSDK导入到AS中 首先在mob官网中注册自己的账号,申请一个app,获得APP Ke ...

  6. [转]Android 和 iPhone 浏览器之战,第 2 部分: 为 iPhone 和 Android 构建基于浏览器的应用程序...

    简介: 本文是共两部分的系列文章 "Android 和 iPhone 浏览器之战" 的第 2 部分,主要关注为 iPhone 和 Android 开发基于浏览器的应用程序.在第 1 ...

  7. Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK

    原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  8. android stack error message is Fail to start the plugin

    E: 08-26 16:34:11.934: E/AliSDK(32236): 错误编码 = 10022 08-26 16:34:11.934: E/AliSDK(32236): 错误消息 = SDK ...

  9. Android应用---基于NDK的samples例程hello-jni学习NDK开发

    Android应用---基于NDK的samples例程hello-jni学习NDK开发 NDK下载地址:http://developer.android.com/tools/sdk/ndk/index ...

  10. android camera2 采集,视频采集:Android平台基于Camera 2的实现

    前言 这篇文章简单介绍下移动端Android系统下利用Camera2相关API进行视频采集的方法. Camera2是谷歌在Android 5.0新增的用来替代Camera1操作摄像头的一个全新的API ...

最新文章

  1. rabbitmq 集群搭建
  2. dnn学习:数据访问(1)
  3. Servlet-ServletConfig对象
  4. .net mysql 测试连接数据库连接,C#.NET连接mysql方法
  5. springboot基于javaweb的课堂考勤系统设计与实现毕业设计源码142335
  6. PyCharm专业版 2021.3 Anaconda安装教程
  7. linux 抓包教程
  8. 【DL BC】矩阵乘积操作简述
  9. 移动办公系统现状分析
  10. java 复制网页文字,网页文字和图片不能复制怎么办
  11. SOAP Action介绍
  12. obs噪音抑制调多少合适_(3)阿里国际站OBS申请设置使用教程,OBS音频没有声音怎么办?国际站直播回放如何下载?...
  13. matlab7 fig exe 阴影,Matlab 生成完全独立运行的 EXE文件的问题请教
  14. 赵小楼《天道》《遥远的救世主》问答集(5)每一条评论都是一个独立意识所展现的相,在这是用文字问答的形式呈现出来的相
  15. Git在windows下的安装和使用GIT@OSC
  16. 网络协议对应的端口号
  17. Kimbal Musk 介绍:埃隆马斯克的弟弟
  18. arm汇编和c语言混合编程实验报告,arm实验ARM汇编和C语言混合编程.doc
  19. python爬取快手粉丝榜_[Python] 【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...
  20. 还在if-else行走天下?试试【策略模式】吧

热门文章

  1. asp网络编程:用ASP构建音乐服务器的方法
  2. 一起学习MVC(4)-entity SQL语句
  3. oracle 聚合函数 LISTAGG ,将多行结果合并成一行
  4. 分布式文件系统FastDFS看这一篇就够了(文件上传下载、单机部署及集群部署)
  5. 记一次逆向拿到github token 然后dump掉别人所有库的
  6. golang cover协程异常
  7. Android 逆向流程
  8. 二叉树的前中后序遍历的三种实现(java)以及一些小习题
  9. 微型计算机三级项目,微机原理三级项目.doc
  10. php怎么处理一对多,php - 如何处理内部连接以及与OOP的一对多关系? - SO中文参考 - www.soinside.com...