1,Messenger 简介

不同进程之间传递message对象,message里面设置传递的数据,实现进程间消息传递。(底层使用是aidl)

2,消息传递基本流程如下

服务器:创建Service处理来自服务器的连接请求,同时创建handler以及Messenger对象,在Service的onBinder方法中返回service底层的IBinder
客户端:绑定Service,并且建立连接,绑定成功后服务器会返回IBinder,通过IBinder创建Messenger对象,发送消息,接收消息,处理消息等。

2,代码逻辑

服务端:

//清单文件进行配置
<service android:name=".MessengerService"android:process=":remote"/>
//创建Service接收来自服务器的消息等
public class MessengerService extends Service {private static String TAG = "MessengerService";private Messenger mMessenger = new Messenger(new MessageHandler());private class MessageHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:Log.e(TAG, "message from client" + msg.getData().getString("msg"));replyToClient(msg);//接收到客户端的消息并且返回结果break;default:super.handleMessage(msg);}}}private void replyToClient(Message msg) {Messenger messenger = msg.replyTo; //回复客户端Message message = Message.obtain(null,1);Bundle bundle = new Bundle();bundle.putString("msg","来自服务器的数据data");message.setData(bundle);try {messenger.send(message);} catch (RemoteException e) {e.printStackTrace();}}@Nullable@Overridepublic IBinder onBind(Intent intent) {return mMessenger.getBinder(); //返回来自服务器底层的IBinder}
}

客户端

 //绑定服务Intent intent = new Intent(this,MessengerService.class);bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
//服务绑定成功private Messenger mService;private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mService = new Messenger(service);Message message = Message.obtain(null,1);Bundle bundle = new Bundle();bundle.putString("msg","客户端数据");message.setData(bundle);message.replyTo = mMessage;//回复服务器try {mService.send(message);} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {}}; //客户端收到服务器返回的数据    private Messenger mMessage = new Messenger(new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 1:Log.e(TAG,"MainActivity:"+msg.getData().getString("msg"));break;}}});          

注:bindService(Intent service, ServiceConnection conn, int flags)方法有flag参数,绑定service的行为和行为模式,其中BIND_AUTO_CREATE和BIND_WAIVE_PRIORITY两个flag也就是Android4.0版本前后有一些区别,主要是:
1,在4.0之前,Service的优先级被默认视同后台任务,如果设置了BIND_AUTO_CREATE则Service的优先级将等同于宿主进程,也就是调用bindService的进程。
2,在4.0以后,Service的优先级默认为宿主进程,有设置了BIND_WAIVE_PRIORITY才会使Service的被当做后台任务对待。

进程间通讯Messenger相关推荐

  1. Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  2. Android-Binder进程间通讯机制-多图详解

    本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据?​​​​​​​ 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...

  3. Android中进程间通讯 AIDL

    Android中进程间通讯 AIDL IDL Interface Description Language  接口描述语言 AIDL Android IDL 适用场景:    client进程必须是A ...

  4. 管道实现进程间通讯 、WaitNamedPipe

    一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...

  5. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:h ...

  6. linux open 头文件_linux下通过共享内存和mmap实现进程间通讯

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  7. Android(IPC)进程间通讯1:详解Binder由来?

    完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...

  8. linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  9. Linux 进程间通讯(IPC)方式 ------- 共享内存

    Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...

最新文章

  1. 荣耀30pro系统_荣耀30 pro:正式再见!
  2. php处理json请求(php获取post请求的json数据的实现方法)
  3. 【杂谈】为什么Pytorch这么好用我还苦口婆心推荐初学者也学习一下caffe?
  4. eclipse 创建maven web项目_Eclipse创建第一个Scala项目(过程)
  5. 将多张图整合到一张大图中,再用css定位技术
  6. Failed to execute goal maven-gpg-plugin 1.5 Sign
  7. 移动app显示远程服务器错误,KIS移动应用常见问题汇总
  8. java教程传智播客,面试真题解析
  9. slf4j的简单用法以及与log4j的区别
  10. Linux 目录配置标准:FHS
  11. ROS学习笔记基础1(Ubuntu16.04安装ROS和依赖包)
  12. 自定义Flash背景的相关设置方法以及其与目录下的文件的对应关系
  13. java泛型为伪泛型,什么,JAVA的泛型是伪泛型
  14. jaxb xml 生成 java_java-如何使用JAXB定制XML导出
  15. python批量图片进行双三插值BiCubic后,输出保存(亲测可用)。
  16. CoffeeScript
  17. jmeter之PerfMon Metrics Collector自定义查看cpu百分比
  18. 基于微信小程序实现番茄钟专注时间项目演示【附项目源码+论文说明】
  19. Oracle Linux 8.5上架微软商店;英特尔发力 RISC-V;200 亿参数 GPT-NeoX 即将开源 | 开源日报
  20. 学 Python 和学 Java ,哪个好找工作?

热门文章

  1. vue 地理位置定位_cordova+vue webapp 使用html5获取地理位置
  2. GitHub给老照片上色项目曝光:用AI修复母亲的旧照片
  3. DevOps深度分享:从项目制到产品制实现价值传递
  4. JIFFIES——系统滴答
  5. php strncmp函数用法,php strncmp函数怎么用
  6. base64 显示图片和pdf
  7. ModifyMenu的用法
  8. 如何利用今日头条盈利?
  9. gganimate绘制动图观察连续变化数据
  10. 应用性能监控(APM)