Messenger可以在不同进程中传递Message对象,我们在Message中加入我们想要传的数据就可以在进程间的进行数据传递了。Messenger是一种轻量级的IPC方案并对AIDL 进行了封装,它实现起来比较容易,下面我们来看看如何实现。

首先我们先写服务端(MessengerService.java),在onBind方法中创建Messenger,关联接收消息的Handler调用getBinder来获取Binder对象,在handleMessage方法中接收客户端发来的信息。

服务端(MessengerService.java): 在handleMessage回调中收到客户端信息时,我们调用Message.replyTo得到客户端传过来的Messenger对象,创建消息并通过Messenger发送给客户端。

public class MessengerService extends Service {
public static final String TAG = "MoonMessenger";
public static final int MSG_FROMCLIENT=1000; private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_FROMCLIENT:
Log.i(TAG,"服务端收到的信息-------"+msg.getData().get("msg"));
//得到客户端传来的Messenger对象
Messenger mMessenger=msg.replyTo;
Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT);
Bundle mBundle=new Bundle();
mBundle.putString("rep","这里是服务端,我们收到信息了");
mMessage.setData(mBundle);
try {
mMessenger.send(mMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
}; @Override
public IBinder onBind(Intent intent) {
Messenger mMessenger=new Messenger(mHandler);
return mMessenger.getBinder();
}
}

客户端(MessengerActivity.java),客户端需要创建一个Handler来接收服务端的信息,前面我们在服务端调用Message.replyTo得到客户端传过来的Messenger对象,可是客户端并没有传送Messenger对象啊,现在我们加上这段代码将Messenger对象传给服务端,当然需要关联我们定义的Handler。

public class MessengerActivity extends AppCompatActivity {
private Messenger mMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
Intent intent=new Intent(MessengerActivity.this,MessengerService.class);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MessengerService.MSG_FROMCLIENT:
Log.i(MessengerService.TAG, "客户端收到的信息-------" + msg.getData().get("rep"));
break;
}
}
}; private ServiceConnection mServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMessenger=new Messenger(service);
Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT);
Bundle mBundle=new Bundle();
mBundle.putString("msg", "这里是客户端,收到了嘛服务端");
mMessage.setData(mBundle);
//将Messenger传递给服务端
mMessage.replyTo=new Messenger(mHandler);
try {
mMessenger.send(mMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
} @Override
public void onServiceDisconnected(ComponentName name) { }
};
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConnection); }
}

当然别忘了注册servce时要另开一个进程:

<service android:name=".MessengerService" android:process=":remote"></service>

   

运行代码查看Log,大功告成。 

 

Android IPC机制(二)用Messenger进行进程间通信的更多相关文章

  1. Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

    在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...

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

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

  3. android IPC 机制 (开发艺术探索)

    一.IPC 机制介绍 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程和线程 ...

  4. Android IPC机制全解析&lt;一&gt;

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  5. 深入理解Android IPC机制之Binder机制

    Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Sign ...

  6. Android IPC机制基础

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  7. Android IPC机制—Binder的工作机制

    进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...

  8. Android IPC机制之Messenger

    Messenger:两个进程通过Messenger传递消息,进程1和进程2中都需要创建一个Messenger,创建过程:首先进程2需要创建一个服务, 并在服务中创建一个Messenger对象,进程1通 ...

  9. Android IPC机制全解析&lt;二&gt;

    在AIDL文件中并不是所有的数据类型都可以使用,AIDL支持的数据类型如下: 基本数据类型(int.long.char.boolean.double等) String和CharSequence Lis ...

随机推荐

  1. IE6图片元素img下高度超出出现多余空白

    将图片转换为块级元素:display:block; 设置图片的垂直对齐方式:vertical-align属性为top,text-top,bottom,text-bottom 设置父元素的字体大小为0p ...

  2. C#基础---Attribute(标签) 和 reflect(反射) 应用

    1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Micros ...

  3. android oauth 微博客户端 架构一

    最近研究oauth协议,为了进一步 的巩固自己的学习成果,顾完成了android的新浪客户端.他的架构如下: UI层微博中的各个窗体  就是所谓的各个activitylogic层程序的核心控制调度模块 ...

  4. Android Studio 学习 - HelloWorld

    今天是学习Android Studio的第2天,加油! 1. 首先要记录下使用Android Studio的一个代码自动完成的功能.平常基本上用Delphi,乍一换工具,各种不习惯,或者说不熟悉.按照 ...

  5. IP地址,子网掩码,默认网关,路由,形象生动阐述

    自己的Linux虚拟机已经分配了固定的IP地址(使用无线路由,用的是192.168.1.XX网段),公司的无线网络分配的IP地址是(10.51.174.XX网段) 所以当自己的电脑拿到公司,还想使用桥 ...

  6. 数据库创建&amp;数据表创建

    --第2_1题创建数据库 create database Student201038897041 on primary (name='student1', filename='F:\coures\SQ ...

  7. 怎样使用jstack诊断Java应用程序故障(转)

    最近一段时间,我们的生产系统升级频繁出现故障,具体故障现象是启动后10来分钟就出现交易缓慢,处理线程耗尽等现象,并且故障发生的频率蛮高的.经过详细的诊断和排查,终于发现了问题,是groovy在osgi ...

  8. 1.2 如何使用LINQ

    LINQ作为一种数据查询编码方式,它本身不是独立的开发语言,也不能进行应用程序开发.但是在.NET 4.5中,可以在C#中集成LINQ查询代码. 在任何源代码文件中,要使用LINQ查询功能,必须引用S ...

  9. java异常总结(转载)

    转至 Java常见异常(Runtime Exception )小结 http://www.apkbus.com/android-58405-1-1.html 本文重在Java中异常机制的一些概念.写本 ...

  10. Calico 的网络结构是什么?- 每天5分钟玩转 Docker 容器技术(68)

    上一节我们部署了 Calico 网络,今天将运行容器并分析 Calico 的网络结构. 在 host1 中运行容器 bbox1 并连接到 cal_net1: docker container run ...