一、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类的使用的更多相关文章

  1. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger

    Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...

  2. Messenger实现Android IPC

    当Service不需要支持并发操作时Messenger会非常有用.Messenger类使用Handler执行每个传入的消息,所有客户端的调用都按顺序运行在同一个线程上,这和AIDL是有区别的,AIDL ...

  3. 利刃 MVVMLight 9:Messenger

    MVVM的目标之一就是为了解耦View和ViewModel.View负责视图展示,ViewModel负责业务逻辑处理,尽量保证 View.xaml.cs中的简洁,不包含复杂的业务逻辑代码. 但是在实际 ...

  4. 利刃 MVVMLight 10:Messenger 深入

    1.Messager交互结构和消息类型 衔接上篇,Messeger是信使的意思,顾名思义,他的目是用于View和ViewModel 以及 ViewModel和ViewModel 之间的消息通知和接收. ...

  5. 跨进程通信之Messenger

    1.简介 Messenger,顾名思义即为信使,通过它可以在不同进程中传递Message对象,通过在Message中放入我们需要的入局,就可以轻松实现数据的跨进程传递了.Messenger是一种轻量级 ...

  6. 【Android】17.5 利用Messenger实现进程间通信(IPC)

    分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenge ...

  7. MVVMLight - Messenger 2

    本篇介绍MvvmLight中一个重要的东东,那就是Messenger. (一)Messenger的基本组成 Messenger类用于应用程序的通信,接受者只能接受注册的消息类型,另外目标类型可以被指定 ...

  8. Messenger和MVVM中的View Services

    在前面的文章IoC容器和MVVM中, 介绍了IoC容器如何在大量用户类中帮助创建和分配用户类的实例.本文将介绍IoC容器如何帮助应用程序解耦,比如那些根据MVVM模式开发的应用.此模 式广泛应用在基于 ...

  9. (转载)Android中的Service:Binder,Messenger,AIDL(2)

    前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ...

随机推荐

  1. [Math]Divide Two Integers

    otal Accepted: 54356 Total Submissions: 357733 Difficulty: Medium Divide two integers without using ...

  2. ZendStudio10 代码格式化 xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <profi ...

  3. AngularJS 不得不了解的服务 $compile 用于动态显示html内容

    项目中一度纠结与AngularJS如何动态显示不同的html内容. 本来是希望直接使用下面的语句来实现: <div> </div> 但是很尴尬的是,这样不能识别出html标签, ...

  4. Interaction with the camera or the photo library

    As we said before, we need a delegate to deal with the user interaction with the camera or the photo ...

  5. php 代码重用

    <?php /* 21.php * 代码重用 * include() required()载入文件 * include() 如果载入文件不存在,提示警告,还可以继续执行 * required() ...

  6. 新测 thinkphp3.2 整合 PHPMailer 发送邮件

    PHPMailer 的官方网站:http://phpmailer.worxware.com/ PHPMailer 最新类库下载地址:[点击下载] PHPMailer GitHub 下载地址:https ...

  7. microwindows Win32 API demo

    初次使用microwindows,资料有限,我也是费了很多功夫才明白.所以记录下来,好帮助那些爱学习的童鞋,另外请大虾们多多指教. 什么是microwindows,什么作用,等背景介绍我就不多说了,因 ...

  8. class之cls

    cls代表的是类本身,一般在静态方法中使用

  9. 寻找最大数--nyoj题目448

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  10. PHPExcel导出

    第一,先查出数据库里面要生成Excel的数据,如: $data= M('User')->findAll();   //查出数据 $name='Excelfile';    //生成的Excel文 ...