Android IPC机制(二)用Messenger进行进程间通信
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进行进程间通信的更多相关文章
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...
- 【Android】17.5 利用Messenger实现进程间通信(IPC)
分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenge ...
- android IPC 机制 (开发艺术探索)
一.IPC 机制介绍 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程和线程 ...
- Android IPC机制全解析<一>
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- 深入理解Android IPC机制之Binder机制
Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Sign ...
- Android IPC机制基础
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- Android IPC机制—Binder的工作机制
进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...
- Android IPC机制之Messenger
Messenger:两个进程通过Messenger传递消息,进程1和进程2中都需要创建一个Messenger,创建过程:首先进程2需要创建一个服务, 并在服务中创建一个Messenger对象,进程1通 ...
- Android IPC机制(四)用ContentProvider进行进程间通信
前言 ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的.ContentProvider底层实现也是Binder,但是使用起来比 ...
随机推荐
- 【分布式事务】基于RocketMQ搭建生产级消息集群?
导读 目前很多互联网公司的系统都在朝着微服务化.分布式化系统的方向在演进,这带来了很多好处,也带来了一些棘手的问题,其中最棘手的莫过于数据一致性问题了.早期我们的软件功能都在一个进程中,数据的一致性可 ...
- 推荐一篇关于java集合的博文,写的很nice
这也是我自己在网上看到的一篇博文,作者的博文都很棒,以后还会持续为大家推荐好的博文,只要大家不骂我只会转别人的博文,自己不会写,其实这些都是基础,前辈们已经在实践中总结的很细很全了,所以也没必要去总结 ...
- jQuery源码——.html()方法原理解析
在将字符串转化为html碎片时,一般会将字符串作为容器的innerHTML属性赋值.但innerHTML有很多局限性,比如我们想转化的字符串中有<script>标签并且包含一个立即执行的函 ...
- 【网页加速】lua redis的二次升级
之前发过openresty的相关文章,也是用于加速网页速度的,但是上次没有优化好代码,这次整理了下,优化了nginx的配置和lua的代码,感兴趣的话可以看看上篇的文章: https://www.cnb ...
- MyBatis源码解析(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...
- 乐观锁机制解决多层嵌套异步ajax问题
前言 在项目中我们通常需要使用ajax异步嵌套去请求数据并做数据的展示,当我们多次快速的多次的发起ajax,因为ajax是异步的,每个ajax触发回调的时间都是不可控的,这样就会造成前面发起的ajax ...
- “笨方法”学习Python笔记(1)-Windows下的准备
Python入门书籍 来自于开源中国微信公众号推荐的一篇文章 全民Python时代,豆瓣高级工程师告诉你 Python 怎么学 问:请问你目前最好的入门书是那本?有没有和PHP或者其他语言对比讲Pyt ...
- JAVA & .NET创建对象构造函数调用顺序
JAVA 定义Person类 package models; public class Person { public Person() { System.out.println("pe ...
- T-SQL基础(五)之增删改
在前面的文章中对T-SQL的查询做了基本总结,接下来我们看下SQL中的另外一个常用操作——数据的修改. INSERT INSERT 向数据表中插入数据的基本语句,句式: INSERT INTO tab ...
- JavaScript 获取按键,并屏蔽系统 Window 事件
// JavaScript 获取按键,并屏蔽系统 Window 事件 window.document.onkeydown = onkeydown; function onkeydown(event) ...