Messenger类的使用

时间:2023-02-23 16:25:46

一、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类的使用

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. 视音频技术作业一:比较CCD与CMOS摄像的区别

    作业详解: CCD与CMOS简介: CCD: CCD是Charge Coupled Device(电荷耦合器件)的缩写,它是一种半导体成像器件,因而具有灵敏度高.抗强光.畸变小.体积小.寿命长.抗震动 ...

  2. 使用命令行进行 VS单元测试 MSTest

    测试 指定的方法 "D:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\MSTest.exe" /test ...

  3. HDU 5802 Windows 10 (贪心+dfs)

    Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...

  4. (转载)linux中shell变量

    (转载)http://blog.csdn.net/zahuopuboss/article/details/8633891 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存 ...

  5. centos 开启apache rewrite模式

    mod_rewrite能使网页伪静态,对于搜索引擎友好,下面就是开启这个功能的说明!启用mod_rewrite模块在conf目录的httpd.conf文件中找到 LoadModule rewrite_ ...

  6. lwp 模拟行锁堵塞 前端超时

    jrhmpt01:/root/async# cat a2.pl use LWP::UserAgent; use utf8; use DBI; use POSIX; use HTTP::Date qw( ...

  7. C#使用LitJson解析JSON(转)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Decembe ...

  8. 深入理解css3中的线性渐变

    css3中的线性渐变 线性渐变公式: background-image: linear-gradient( [ <angle> | <side-or-corner> ]?, & ...

  9. 关于input type&equals;file上传图片的总结

    最近比较忙,现在来整理一下近期的成果,方便以后再次使用. 关于图片上传的js 和jq jq $("input").change(function () { var $file = ...

  10. jQuery封装自定义事件--valuechange&lpar;动态的监听input,textarea&rpar;之前值,之后值的变化

    jQuery封装自定义事件--valuechange(动态的监听input,textarea)之前值,之后值的变化 js监听输入框值的即时变化 网上有很多关于 onpropertychange.oni ...