Messenger类的使用
一、Messenger类
作用:类似Message类,但是是跨进程使用的。
解析:它的底层是由AIDL实现的,从构造方法可以看出
//Service使用
public Messenger(Handler target){
mTarget = target.getIMessenger();
}
//Client端使用
public Messenger(IBinder targer){
mTarget = IMessenger.Stub.asInterface(target);
}
二、使用(Service与Client互相发送信息)
步骤一:Service端创建Messenger
public class BookService extends Service {
private static final String TAG = "BookService";
//①:创建Handler,为创建Messenger做准备
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
//当客户端发送信息的时候吗,输出
Bundle bundle = msg.getData();
Log.d(TAG,"Service收到消息"+bundle.getString("msg"));
break;
}
}
};
//②:创建Messenger
private Messenger mMessenger = new Messenger(mHandler);
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
//③:将Messenger对象的Binder返回给Client
return mMessenger.getBinder();
}
}
步骤二:Client端接收Messenger发送信息给Service端
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Messenger mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//重新创建Messenger
mService = new Messenger(service);
//从Msg池中获取message
Message msg = Message.obtain(null,0);
//创建Bundle
Bundle bundle = new Bundle();
bundle.putString("msg","Hello,nice to meet you");
//将Bundle装进message对象中
msg.setData(bundle);
try {
//将message发送给服务端,同时说明Message继承了Parcelable接口
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent = new Intent(this,BookService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
}
步骤三:实现服务器向客户端发送信息的双向交流
//Client端 /**
*第一步:创建Handler接收服务器发送过来的信息
*/
private Handler mHandler = new Handler(){ @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
Bundle bundle = msg.getData();
Log.d(TAG,"客户端接收到信息:"+bundle.getString("replyData"));
break;
}
}
}; /**
*第二步:在 public void onServiceConnected(ComponentName name, IBinder service) 方法中添加
*/
msg.replyTo = mService;
/**
*Service端的Handler中
*/
//在Handler中接收到Client中传送过来的Messenger
Messenger messenger = msg.replyTo;
//创建Msg
Message replyMessage = Message.obtain(null,0);
try {
//将Msg发送回给Client
messenger.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
流程图

Messenger类的使用的更多相关文章
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...
- Messenger实现Android IPC
当Service不需要支持并发操作时Messenger会非常有用.Messenger类使用Handler执行每个传入的消息,所有客户端的调用都按顺序运行在同一个线程上,这和AIDL是有区别的,AIDL ...
- 利刃 MVVMLight 9:Messenger
MVVM的目标之一就是为了解耦View和ViewModel.View负责视图展示,ViewModel负责业务逻辑处理,尽量保证 View.xaml.cs中的简洁,不包含复杂的业务逻辑代码. 但是在实际 ...
- 利刃 MVVMLight 10:Messenger 深入
1.Messager交互结构和消息类型 衔接上篇,Messeger是信使的意思,顾名思义,他的目是用于View和ViewModel 以及 ViewModel和ViewModel 之间的消息通知和接收. ...
- 跨进程通信之Messenger
1.简介 Messenger,顾名思义即为信使,通过它可以在不同进程中传递Message对象,通过在Message中放入我们需要的入局,就可以轻松实现数据的跨进程传递了.Messenger是一种轻量级 ...
- 【Android】17.5 利用Messenger实现进程间通信(IPC)
分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenge ...
- MVVMLight - Messenger 2
本篇介绍MvvmLight中一个重要的东东,那就是Messenger. (一)Messenger的基本组成 Messenger类用于应用程序的通信,接受者只能接受注册的消息类型,另外目标类型可以被指定 ...
- Messenger和MVVM中的View Services
在前面的文章IoC容器和MVVM中, 介绍了IoC容器如何在大量用户类中帮助创建和分配用户类的实例.本文将介绍IoC容器如何帮助应用程序解耦,比如那些根据MVVM模式开发的应用.此模 式广泛应用在基于 ...
- (转载)Android中的Service:Binder,Messenger,AIDL(2)
前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...
随机推荐
- MyEclipse破解方法
Myeclipse 2014 破解补丁,首先需要先下载 Myeclipse 2014 官方安装文件,下载地址 http://www.jb51.net/softs/150886.html,然后下载此补丁 ...
- 网络受限下,使用Nexus要解决的两个问题
在网络受限的情况下,使用nexus总会遇到这么两个问题,让你头疼. 我头疼过了,为了不让大家头疼,把解决方案放在这里,供大家参考. 问题一.背景: 由于网络原因,Nexus无法更新远程仓库的索引. ...
- flash的as操作XML
//as3.0 var myXML:XML = new XML(); var XML_URL:String = "nav.config"; var myXMLURL:URLRequ ...
- MSSQL 导入导出文本文件
exec master..xp_cmdshell'net use \\192.168.1.8\testfolder "0123" /user:192.168.1.8\wjp' EX ...
- CentOS查看CPU、内存、网络流量和磁盘 I/O
安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/swrqm/s: 每秒进行 merge 的 ...
- Linux的启动流程以及GRUB详解
一.Linux引导和启动流程 概述,计算机电源接通后通过BISO之后,没有问题,就会去硬盘上找到MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区, ...
- chart
var pieChart = { width: 600, height: 400, series: [], unit: "kg", chartCanvas: null, selec ...
- mysql 分区 按 PARTITION BY RANGE (TO_DAYS(startTime))
to_days() Given a date date, returns a day number (the number of days since year 0). 给定一个date 日期,返回天 ...
- sysstat服务负载统计,如CPU占有率,网络使用率,磁盘速度
sysstat服务负载统计,如CPU占有率,网络使用率,磁盘速度
- IP地址分类与识别错误
//描述: 请解析IP地址和对应的掩码,进行分类识别.要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类. //所有的IP地址划分为 A,B,C,D,E五类 //A类地址1.0.0.0 ...