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之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建 ... 
随机推荐
- 在windows中使用VMWare安装Mac OS 10.7
			请参考http://www.cnblogs.com/huwlnew/archive/2011/11/15/2250342.html http://unmi.cc/vmware9-install-mac ... 
- 如何查看SQLServer数据库每个表占用的空间大小?
			如何查看SQLServer数据库每个表占用的空间大小? 创建存储过程: CREATE PROCEDURE [dbo].[sys_viewTableSpace]AS BEGIN SET NOCOUNT ... 
- B - Maya Calendar(第二季水)
			Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ... 
- C++ 多态性浅谈
			多态:一个接口, 多种方法.程序在运行时才决定调用的函数是什么. C++多态通过 虚函数实现, 虚函数允许子类重新定义成员函数, 子类override父类. 多态与非多态的实质区别:函数地址是早绑定还 ... 
- 发现一个不错的学习git的地方
			Git入门:http://rogerdudler.github.io/git-guide/index.zh.html 简洁.实用.高效的学习git基本操作的方式 
- 理解中WebAPI的属性和相关操作 FormBody和 FormUri等(WebAPI 二)
			1.FromUri使用 将数据通过url方式传递.我们需要在webapi方法标明,这个参数只接受url中参数的值, $("#Save").click(function () { $ ... 
- 恶补ASP.NET基础【1】枚举和结构
			有时我们希望变量提取的是一个固定集合中的值,此时就可以用枚举类型, 例: enum OpenMode : byte { 新增=, 编辑=, 查看= } class Program { static v ... 
- Oracle EBS-SQL (BOM-15):检查多层BOM(含common BOM).sql
			select distinct b.lvl 层次, b.OPERATION_SEQ ... 
- 阿里云 centos 修改iptables
			一.检查iptables服务状态 首先检查iptables服务的状态 [root@woxplife ~]# service iptables status iptables: Firewall is ... 
- 一个.java文件中可以有几个同级类
			1.在一个.java文件中可以有几个类.修饰符只可以public abstract final和无修饰符,不能是其他的private等修饰符.2.public修饰的只能有一个,且要与文件名相同 若没有 ... 
