进程间通讯Messenger
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相关推荐
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- Android-Binder进程间通讯机制-多图详解
本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据? 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...
- Android中进程间通讯 AIDL
Android中进程间通讯 AIDL IDL Interface Description Language 接口描述语言 AIDL Android IDL 适用场景: client进程必须是A ...
- 管道实现进程间通讯 、WaitNamedPipe
一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...
- QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址:h ...
- linux open 头文件_linux下通过共享内存和mmap实现进程间通讯
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
- Android(IPC)进程间通讯1:详解Binder由来?
完整原文:http://tryenough.com/android-... Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方 ...
- linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
- Linux 进程间通讯(IPC)方式 ------- 共享内存
Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...
最新文章
- 荣耀30pro系统_荣耀30 pro:正式再见!
- php处理json请求(php获取post请求的json数据的实现方法)
- 【杂谈】为什么Pytorch这么好用我还苦口婆心推荐初学者也学习一下caffe?
- eclipse 创建maven web项目_Eclipse创建第一个Scala项目(过程)
- 将多张图整合到一张大图中,再用css定位技术
- Failed to execute goal maven-gpg-plugin 1.5 Sign
- 移动app显示远程服务器错误,KIS移动应用常见问题汇总
- java教程传智播客,面试真题解析
- slf4j的简单用法以及与log4j的区别
- Linux 目录配置标准:FHS
- ROS学习笔记基础1(Ubuntu16.04安装ROS和依赖包)
- 自定义Flash背景的相关设置方法以及其与目录下的文件的对应关系
- java泛型为伪泛型,什么,JAVA的泛型是伪泛型
- jaxb xml 生成 java_java-如何使用JAXB定制XML导出
- python批量图片进行双三插值BiCubic后,输出保存(亲测可用)。
- CoffeeScript
- jmeter之PerfMon Metrics Collector自定义查看cpu百分比
- 基于微信小程序实现番茄钟专注时间项目演示【附项目源码+论文说明】
- Oracle Linux 8.5上架微软商店;英特尔发力 RISC-V;200 亿参数 GPT-NeoX 即将开源 | 开源日报
- 学 Python 和学 Java ,哪个好找工作?