Android IPC机制Messenger实例详解

前言:
Messenger可以翻译成信使,通过它可以在不同进程间传递Message对象有了它就可以轻松实现进程间的数据传递了。
Messenger使用的方法相对AIDL比较简单,它对AIDL做了一层封装是的我们不需要像采用AIDL那样去实现进程通信那么麻烦,可以看看他的源码有AIDL的迹象。
public final class Messenger implements Parcelable {
private final IMessenger mTarget;
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public void send(Message message) throws RemoteException {
mTarget.send(message);
}
public IBinder getBinder() {
return mTarget.asBinder();
}
public boolean equals(Object otherObj) {
if (otherObj == null) {
return false;
}
try {
return mTarget.asBinder().equals(((Messenger)otherObj)
.mTarget.asBinder());
} catch (ClassCastException e) {
}
return false;
}
public int hashCode() {
return mTarget.asBinder().hashCode();
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeStrongBinder(mTarget.asBinder());
}
public static final Parcelable.Creator<Messenger> CREATOR
= new Parcelable.Creator<Messenger>() {
public Messenger createFromParcel(Parcel in) {
IBinder target = in.readStrongBinder();
return target != null ? new Messenger(target) : null;
}
public Messenger[] newArray(int size) {
return new Messenger[size];
}
};
public static void writeMessengerOrNullToParcel(Messenger messenger,
Parcel out) {
out.writeStrongBinder(messenger != null ? messenger.mTarget.asBinder()
: null);
}
public static Messenger readMessengerOrNullFromParcel(Parcel in) {
IBinder b = in.readStrongBinder();
return b != null ? new Messenger(b) : null;
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
}
首先我们需要新建一个Service来处理客户端的请求,同时声明一个Handler作为参数来创建一个Messenger,然后通过getBinder()方法返回Binder。
public class MessageService extends Service {
private Messenger mMessenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msgFromClient) {
super.handleMessage(msgFromClient);
Message msgToTarget = Message.obtain(msgFromClient);
msgToTarget.what = 0;
try {
Thread.sleep(2000);
msgToTarget.arg1 = msgFromClient.arg1 + msgFromClient.arg2;
msgFromClient.replyTo.send(msgToTarget);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}
里面的逻辑是简单的将客户端传来的Message中的arg1和arg2的值相加并将结果返回给Message对应的replyTo这个Messenger,并通过send将服务端的Message返回给客户端。
然后在客户端处理:首先需要bindService来绑定这个Service,然后通过IBinder生成一个Messenger对象,这个Messenger对象就可以将需要处理的数据封装到Message然后send到Service去。
Messenger mMessenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.w("Jayuchou", "--- 从异步线程中读取到数据 --- " + msg.arg1);
}
});
Messenger mService;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
Log.w("Jayuchou", "-- Connected success --");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.w("Jayuchou", "-- Connected dismiss --");
mService = null;
}
};
然后调用的地方方式为:
Message msgFromClient = Message.obtain(null, 0, 1, 2);
msgFromClient.replyTo = mMessenger;
try {
mService.send(msgFromClient);
} catch (RemoteException e) {
e.printStackTrace();
}
将数据封装Message中,并且Message中的replyTo指定服务端中要将结果回调的Messenger对象。
msgFromClient.replyTo.send(msgToTarget);
我们可以看到Service中有这么一句代码,其中的replyTo就是我们在客户端传进去的Messenger,这时候调用send方法就可以将服务端的也就是另一个进程的数据传到想要用的进程然后采用Messenger进行接收,我们可以跟Handler用法类似的使用即可。Messenger是一个轻量级的AIDL,一次一个处理请求。
以上就是Android messenger 的消息处理的详解,关于Android 开发的文章,本站还很多,请大家搜索参阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# IPC机制Messenger
# IPC机制的详解
# 详解Android跨进程IPC通信AIDL机制原理
# Android之使用Bundle进行IPC详解
# Android系统进程间通信(IPC)机制Binder中的Server和Client获得Servic
# 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
# Android clipChildren属性实例详解
# android IPC之binder通信机制
# Android IPC机制ACtivity绑定Service通信代码实例
# 客户端
# 服务端
# 就可以
# 是一个
# 一句
# 中有
# 请大家
# 我们可以
# 希望能
# 并将
# 可以看到
# 它可以
# 要将
# 不需
# 谢谢大家
# 它就
# 绑定
# 它对
# 创建一个
# 回调
相关文章:
北京网站制作公司哪家好一点,北京租房网站有哪些?
javascript基本数据类型及类型检测常用方法小结
建站之星安装模板失败:服务器环境不兼容?
已有域名和空间,如何快速搭建网站?
广州商城建站系统开发成本与周期如何控制?
代刷网站制作软件,别人代刷火车票靠谱吗?
网站图片在线制作软件,怎么在图片上做链接?
ui设计制作网站有哪些,手机UI设计网址吗?
如何通过万网虚拟主机快速搭建网站?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
如何确认建站备案号应放置的具体位置?
常州企业建站如何选择最佳模板?
如何快速生成专业多端适配建站电话?
模具网站制作流程,如何找模具客户?
如何基于云服务器快速搭建网站及云盘系统?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
香港服务器WordPress建站指南:SEO优化与高效部署策略
linux top下的 minerd 木马清除方法
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
利用JavaScript实现拖拽改变元素大小
韩国服务器如何优化跨境访问实现高效连接?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
制作网站公司那家好,网络公司是做什么的?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
中山网站制作网页,中山新生登记系统登记流程?
如何在宝塔面板中创建新站点?
如何通过WDCP绑定主域名及创建子域名站点?
高端建站如何打造兼具美学与转化的品牌官网?
宝塔新建站点报错如何解决?
定制建站是什么?如何实现个性化需求?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站主机空间推荐 高性价比配置与快速部署方案解析
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
北京的网站制作公司有哪些,哪个视频网站最好?
定制建站哪家更专业可靠?推荐榜单揭晓
建站之星后台管理系统如何操作?
山东网站制作公司有哪些,山东大源集团官网?
微信推文制作网站有哪些,怎么做微信推文,急?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
Swift中swift中的switch 语句
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
建站之星如何助力网站排名飙升?揭秘高效技巧
建站主机功能解析:服务器选择与快速搭建指南
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
如何选择服务器才能高效搭建专属网站?
建站之星收费标准详解:套餐费用及年费价格表一览
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
存储型VPS适合搭建中小型网站吗?
如何高效生成建站之星成品网站源码?
如何用低价快速搭建高质量网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。