Messenger 进程间通信
Messenger
使用 Messenger 可以在进程间传递数据, 实现一对多的处理. 其内部实现, 也是基于 aidl 文件, 这个aidl位于: frameworks/base/core/java/android/os/IMessenger.aidl.
服务端与客户端通信, 主要是在传输的消息上做了处理, 让 Message.replyTo 指向的客户端的 Messenger, 而 Messenger 又持有客户端的一个 Binder 对象, 服务端正是利用这个 Binder 对象与客户端的通信.
1.服务端实现
实现一个 Service 类, 定义处理消息的 Messenger 对象, 在 OnBind 时使用 Messenger 对象的 getBinder() 方法返回 Binder 对象.
创建 Messenger 对象时, 使用一个 Handler 对象构造, 此 Handler 用于处理客户端发来的消息.
如果服务端需要向客户端返回数据, 在 Message 对象中取出客户端的 Messenger 对象(Message 对象的 replyTo 参数), 向其发送消息即可.
public class MyService extends Service {
protected static final String TAG = "debug";
private Messenger mMessenger = new Messenger(new MessengerHandler());
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MsgConstants.MESSGE_FROM_CLIENT:
Log.d(TAG, "service get message");
Bundle data = msg.getData();
String msgContent = data.getString("msg");
Log.d(TAG, "" + msgContent);
// 回复客户端
Messenger client = msg.replyTo;
Bundle replyData = new Bundle();
replyData.putString("reply", "你的消息<" + msgContent +">,我已收到");
Message replyMsg = Message.obtain();
replyMsg.what = MsgConstants.MESSGE_FROM_SERVICE;
replyMsg.setData(replyData);
try {
client.send(replyMsg);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
break;
default:
super.handleMessage(msg);
break;
}
}
}
}
// AndoidManifest.xml 中注册服务
<service
android:name="com.example.MyService"
android:exported="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.example.MyService" />
</intent-filter>
</service>
2.客户端实现
首先需要 bindService, 成功时在 ServiceConnection 的 onServiceConnected() 方法中, 将传入 IBinder 对象构造一个 Messenger 对象, 此 Messager 对象用于向服务端发送消息.
如果需要处理服务端返回的数据, 则还需要创建另外一个 Messenger 对象. 在向服务端发送数据时, 将 Message 对象的 replyTo 设置为该 Messenger 对象.
// 连接 Service
Intent service = new Intent("com.example.MyService");
service.setComponent(new ComponentName("com.example", "com.example.MyService"));
bindService(service, mConnection, Service.BIND_AUTO_CREATE); private Messenger mService;
private Messenger mMessenger = new Messenger(new MessengerHandler()); private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Log.d(TAG, "client get message");
switch (msg.what) {
case MsgConstants.MESSGE_FROM_SERVICE:
Bundle data = msg.getData();
Log.d(TAG, "" + data.getString("reply"));
break;
default:
super.handleMessage(msg);
break;
}
}
} private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
}
}; // 向服务端发送数据
try {
Message msg = Message.obtain();
msg.what = MsgConstants.MESSGE_FROM_CLIENT;
Bundle data = new Bundle();
data.putString("msg", "kkkk");
msg.setData(data); // 设置服务端回复的Messenger
msg.replyTo = mMessenger; mService.send(msg);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
Messenger 进程间通信的更多相关文章
- 【转】Android开发中让你省时省力的方法、类、接口
转载 http://www.toutiao.com/i6362292864885457410/?tt_from=mobile_qq&utm_campaign=client_share& ...
- Android开发中一些被冷落但却很有用的类和方法
MediaMetadataRetriever 顾名思义,就是用来获取媒体文件一些相关信息的类.包括一首歌的标题,作者,专辑封面和名称,时长,比特率等等.如果是视频的话,可以获取视频的长宽,预览图. h ...
- android:使用Messenger进行进程间通信(一)
Messenger简介 Messenger和AIDL是实现进程间通信(interprocess communication)的两种方式. 实际上,Messenger的实现其实是对AIDL的封装. Me ...
- android:使用Messenger进行进程间通信(二)
//继续完善音乐播放器demo 相关文章: android:使用Messenger进行进程间通信(一):http://www.cnblogs.com/happyhacking/p/5318418.ht ...
- Android 基于Message的进程间通信 Messenger完全解析
一.概述 说到Android进程间通信,大家肯定能想到的是编写aidl文件,然后通过aapt生成的类方便的完成服务端,以及客户端代码的编写.如果你对这个过程不熟悉,可以查看Android aidl B ...
- Android开发——进程间通信之Messenger
0. 前言 不论是Android还是其他操作系统,都会有自己的IPC机制,所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是很不同的概念,线程是CPU ...
- Android 进程间通信——Service、Messenger
概述 介绍绑定服务端的三种方式:同一进程绑定服务.跨进程绑定服务(Messenger).跨进程绑定服务(aidl). 重点说一下通过Messenger.Service实现的进程间通信. 详细 代码下载 ...
- 【Android】17.5 利用Messenger实现进程间通信(IPC)
分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenge ...
- 【起航计划 036】2015 起航计划 Android APIDemo的魔鬼步伐 35 App->Service->Messenger Service Messenger实现进程间通信
前面LocalService 主要是提供同一Application中组件来使用,如果希望支持不同应用或进程使用Service.可以通过Messenger.使用Messgener可以用来支持进程间通信而 ...
随机推荐
- js页面跳转,url带url参数解决方案
今天,在做一个项目的时候,向后端发送了一个Ajax请求,后端返回了一个字符串,告诉我未登录.那么我需要跳转到登录页面,同时告诉登录页面,登录成功后,需要跳回的url.也就是标题所说,url中的一个参数 ...
- ES6的新特性(2)——let 与 const 增强变量声明
let 与 const 增强变量声明 ES6 新增了let命令,用来声明局部变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束. 先看个var的常见 ...
- Yii2 配置request组件解析 json数据
在基础版本的config目录下 web.php 或者高级版config目录下的main.php中配置 'components' =>[ 'request' => [ 'parsers' = ...
- zend安装及破解
Zend下载 https://pan.baidu.com/s/1fCfUQ0j7dxEtOzbNnsgODg 破解: 1.打开dmg文件安装,将Zend Studio拖拽至applications进行 ...
- Java 学习笔记 ------第三章 基础语法
本章学习目标: 认识类型与变量 学习运算符的基本使用 了解类型转换细节 运用基本流程语法 一.类型(基本类型) 所谓基本类型,就是在使用时,得考虑一下数据用多少内存长度存比较经济,利用程序语法告诉JV ...
- vue视频插件VLC
VLC 仅支持windows下特定版本火狐浏览器--Firefox_ESR_55.3 <template> <object type='application/x-vlc-plugi ...
- Alpha阶段敏捷冲刺 ADY8
一.举行站立式例会 今天也没有拍照片,人不齐. 二.团队报告 1.昨日已完成的工作 (1)创建一个test,并且将图片导入进去使其可以显示. 2.今日计划完成的工作 完成收尾工作.实现代码的连接. 3 ...
- PHP SQL查询结果在页面上是乱码
今天系统网页出现这样一个问题:下图左边类型栏数据是没显示出来 打印SQL查询的数据是有的 原因是:————> eval函数里'return '这一字符串一定要有空格哈,没有空格,这语句就是错的. ...
- ant 安装及基础教程 !
这篇文章主要介绍了ant使用指南详细入门教程,本文详细的讲解了安装.验证安装.使用方法.使用实例.ant命令等内容,需要的朋友可以参考下 一.概述 ant 是一个将软件编译.测试.部署等步骤联系在 ...
- 用友 SAP 金蝶 季报
用友 2018Q3季报 营收:.42亿 营收收入同比增长:42.36% 净利润:.35万 净利润同比增长率:113.83% 销售毛利率:66.88% 销售净利率:19.29% 用友2017财年年报 营 ...