Android IPC机制Messenger实例详解
作者:左手木亽 发布时间:2023-04-27 13:25:06
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,一次一个处理请求。
来源:http://blog.csdn.net/neacy_zz/article/details/50811596
猜你喜欢
- Android 代码写控件代替XML简单实例简单的一个Button控件的练习。实现代码:Button btn = new Button(Ha
- 一、简介  Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它
- Q:使用过滤器、 * 与切片实现每个请求耗时的统计,并比较三者的区别与联系过滤器Filter 过滤器概念Filter是J2E中来的,可以看做
- 本文实例分析了Android开发之TimePicker控件用法。分享给大家供大家参考,具体如下:新建项目:New Android Proje
- 垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新
- 验证码及它的作用验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是
- idea 很强大,但是初次安装默认的有很多设置并不是满足我们开发的需要。以前经常一安装就要捣鼓很久,为此吐血整理初次安装设置一、切换主题(配
- java读写ini文件、FileOutputStream在上课让学生练习文件读写,就让他们做了一个使用文件保存账号和密码的练习,有一个比较爱
- 一、Java类的加载顺序引用1个网上的经典例子,并做稍许改动,以便大家更好地理解。public class Animal {
- 1. 概述官方JavaDocsApi: java.awt.BorderLayout BorderLayout,边界布局管理器。它把 Cont
- 前言本文主要介绍的是关于C#中LINQ多条件JOIN时为什么可以使用匿名类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细
- 客户端import java.io.BufferedReader;import java.io.InputStreamReader;impo
- java 实现MD5加密算法的简单实例实现代码:import java.security.NoSuchAlgorithmException;
- 本文实例分析了C#动态生成DropDownList执行失败原因。分享给大家供大家参考。具体如下:今天研究DDL控件的动态生成的时候遇到了点问
- 目录前言简单示例基础操作定时取消关联取消判断取消源码探究构造入手小插曲WaitHandle注册操作取消操作Cancel操作CancelAft
- 本文实例讲述了Java获取UTC时间的方法。分享给大家供大家参考,具体如下:取得本地时间:java.util.Calendar cal =
- 项目地址:gitee.com/baojh123/rp…netty-study 这个项目是没用到的,可以删掉,主要是测试
- AuthenticationProvider解析首先进入到AuthenticationProvider源码中可以看到它只是个简单的接口里面也
- 历史原因当系统启动一个APP时,zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈
- Java 字符串反转问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路