赞
踩
关于Android进程间的通信,在第一篇文章中我们通过传递Parcel对象,利用IBinder完成了进程间的通信,在第二篇文章 中我们通过在客户端创建一个aidl的文件,在服务端实例化由aapt生成的stub类的对象来完成了进程间的通信。今天我们来使用另一种更简洁的方法—Messenger来实现进程间的通信。
进程之间不能共享内存数据, 但是可以进行通信, 除了简单的Intent通信, 也可以使用Messenger, Messenger基于AIDL实现, 顺序执行, 不支持并发. 为了区分通信的始末, 我们暂定发送数据是客户端, 接收数据是服务端. 本文介绍Messenger的使用方式。
Messenger–信使,类的继承关系:
public final class Messenger
extends Object implements Parcelable //实现了Parcelable接口
定义:
1 Reference to a Handler, //一个Messenger关联了一个Handler
2 which others can use to send messages to it.
3 This allows for the implementation of message-based communication across processes, //基于message的进程间通信
4 by creating a Messenger pointing to a Handler in one process,
5 and handing that Messenger to another process.
解释为:Messenger引用了一个Handler对象,以便others能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message的通信(即两个进程间可以通过Message进行通信),在服务端使用Handler创建一个Messenger,客户端持有这个Messenger就可以与服务端通信了。
以前我们使用Handler+Message的方式进行通信,都是在同一个进程中,从线程持有一个主线程的Handler对象,并向主线程发送消息。
可以看到,我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。
远程通过
serviceMessenger=new Messenger(new ServiceHandler());
创建一个信使对象
Intent intent =new Intent(MainActivity.this,MessengerService.class);
bindService(intent, mConn, Context.BIND_AUTO_CREATE);
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("TEST","MessengerService-->onBind()");
return serviceMessenger.getBinder();
}
@Override
public void onServiceConnected(ComponentName name, IBinder service){
Log.i(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。