一、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. (转)C#创建datatable

    Asp.net DataTable添加列和行的方法 方法一: DataTable tblDatas = new DataTable("Datas"); DataColumn dc ...

  2. javascript 算法

    前段时间学习算法方面的知识看了一下用C语言写的一些简单的算法自己用js模拟实现一遍现在整理出来和大家分享一下. 河内塔 斐波那契数列 巴斯卡三角形 三色棋 河内之塔(Towers of Hanoi)是 ...

  3. 2、vector的实现

            看侯捷老师的<STL源码剖析>有一段时间了,打算自己整理一下思路,试着实现一下.主要目的有两个:1.巩固自己对源码的理解,让自己更加深刻的体会其中各种机制的奥妙.别人的知识 ...

  4. 运算符 - PHP手册笔记

    运算符优先级 每种编程语言都有运算符,运算符要学会灵活使用. 运算符拥有不同的优先级和结合方向. <?php var_dump(1 <= 1 == 1); // true var_dump ...

  5. drupal7创始人root忘记密码的解决办法

    在index.php中的drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);之后加入 require_once 'includes/password.inc'; echo ...

  6. Sum Problem-hdu-1001

    Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge). In this problem, your task is to calc ...

  7. ios显示手机信息

    NSString *strname=[[UIDevice currentDevice] name]; NSLog(@"设备名:%@",strname); NSString *str ...

  8. Jquery基础之事件操作

    事件是用户操作时页面或页面加载时引发的用来完成javascript和HTML之间的交互操作.常见的元素点击事件.鼠标事件.键盘输入事件等,较传Javascript 相比JQuery增加并扩展了基本的事 ...

  9. Singleton 单例模式 泛型 窗体控制

    MDI子窗体 控制单例 /// <summary> /// 单例提供者 /// </summary> /// <typeparam name="T"& ...

  10. WIN7 Wireshark: There are no interfaces on which a capture can be done

    有的时候我们在Windows7的环境下使用Wireshark的时候,比如点击[Interface List]的时候,出现错误. 错误内容如下: There are no interfaces on w ...