关键词:
在 IPC(一)利用纯Binder通信(非aidl)中实现了,如何通过纯粹的Binder实现进程间的通信。然后在IPC(四)_Aidl的基本使用过程实现了如何通过Aidl实现进程间的通信。翻看代码的编写过程,其实大体上都差不多,而且也提到Aidl实质上就是对纯Binder通信进行了一次封装,毕竟IBinder中的transact()方法传递的参数不方便使用,大大增加了开发者的使用负担。于是Google就提供了Aidl来简化开发者的负担。简化对于开发者来说既好也不好,因为简化了使用方便了,但是却不容易看清楚内部的原理了。下面就来看一看,Aidl的架构设计。
为了了解清楚Aidl,首先需要理解的就是Binder跨进程通信机制。在IPC(二)初识进程和Binder和 IPC(三)浅析Binder进程通信和ServiceManager中讲解了Binder的跨进程通信机制。下面来一张图,更好的明确Binder过程
IPC(三)中说过,ServiceManager 首先把服务(实现IBinder接口)加载入BinderDriver,接着Bind服务的时候ServiceManager 会返回一个IBinder对象给客户端,其实就是BinderProxy。客户端调用IBinder接口中的Transact()方法通信。
但是Transact()方法毕竟是要传递Pracel对象来传递数据,这大大增加了开发者的负担,于是Aidl就出世了。Aidl为了减轻开发这的负担,在客户端和服务端采用proxy——stub分别对IBinder接口进行了封装,内部调用Transact(),给开发者调用自己定义接口里的方法。
上图就是Aidl的设计过程,在MyActivity和IBinder直接增加了Proxy模式,在MyBinder和Binder之间增加了Stub模式,这两个模式分别包装了IBinder接口,在客户端对数据打包,在服务端对数据进行解包。
说名了Aidl的工作过程。回到IPC(四)中回看AIDL的代码实现过程
public static abstract class Stub extends android.os.Binder implements com.example.server.aidl.IAdd
private static final java.lang.String DESCRIPTOR = "com.example.server.aidl.IAdd";
/** Construct the stub at attach it to the interface. */
public Stub()
this.attachInterface(this, DESCRIPTOR);
IAdd.Stub add=new IAdd.Stub()
@Override
public int add(int i, int j) throws RemoteException
int sum=i+j;
Log.e("ethan", "sum=="+sum);
return sum;
;
上面两段代码分别是Aidl生成文件和MyService的实现代码,其中服务端通过stub返回一个IBinder类型的对象,该对象内部封装了IAdd(自己定义的接口)里的方法add()。
public static com.example.server.aidl.IAdd asInterface(android.os.IBinder obj)
if ((obj==null))
return null;
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.example.server.aidl.IAdd)))
return ((com.example.server.aidl.IAdd)iin);
return new com.example.server.aidl.IAdd.Stub.Proxy(obj);
private static class Proxy implements com.example.server.aidl.IAdd
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
mRemote = remote;
@Override public android.os.IBinder asBinder()
return mRemote;
public java.lang.String getInterfaceDescriptor()
return DESCRIPTOR;
ServiceConnection conn=new ServiceConnection()
@Override
public void onServiceDisconnected(ComponentName name)
@Override
public void onServiceConnected(ComponentName name, IBinder service)
add=IAdd.Stub.asInterface(service);
;
上面代码分别是Aidl的生成代码和客户端的实现方法。客户端通过asInterface 调用内部的proxy,继而返回一个IAdd接口类型的对象。
这时候就清楚了,服务端通过Aidl 的stub把一个IAdd接口对象打包成IBinder对象,通过Service的onBInder方法返回。客户端通过Aidl的asInterface 继而调用proxy 返回一个IAdd对象给客户端。这时候客户端就可以调用自己定义的IAdd接口里面的方法了。虽然Aidl的跨进程通信也是基于Binder的,但是Aidl通过封装了IBinder接口内的transact方法,继而提供给开发者自己定义的接口对象。大大减轻了开发者的负担。
回到 IPC(一)利用纯Binder通信(非aidl)
既然了解了Aidl的架构原理,那么就把IPC(一)中改一改,封装封装,自己实现。
public class MyProxy implements IEthan
private IBinder iBinder;
public MyProxy(IBinder iBinder)
this.iBinder = iBinder;
@Override
public void add(int i, int j)
Parcel data=Parcel.obtain();
int []a=i,j;
data.writeIntArray(a);
Parcel reply = Parcel.obtain();
try
iBinder.transact(0,data,reply,1);
catch (RemoteException e)
e.printStackTrace();
首先是定义一个MyProxy 实现了IPC(一)中的IEthan接口,接着在MyProxy 的构造方法中把IBinder 类型的对象当参数传递进去。同时在add()方法中调用IBinder 接口的transact方法。接着就是调用了
ServiceConnection conn=new ServiceConnection()
@Override
public void onServiceConnected(ComponentName name, IBinder service)
myProxy=new MyProxy(service);
myProxy.add(6,8);
@Override
public void onServiceDisconnected(ComponentName name)
;
在MianActivity中myProxy=new MyProxy(service); 把传递回来的IBinder对象当做参数,实例化myProxy接着调用 myProxy.add(6,8);这样就完美的把Binder内部的transact给封装在内部了,提供给开发者自己定义的接口方法。
04-13 03:29:29.114 2477-2477/com.example.administrator.ui E/ethan: Service onCreate
04-13 03:29:29.118 2477-2489/com.example.administrator.ui E/ethan: onTransact执行了
04-13 03:29:29.118 2477-2489/com.example.administrator.ui E/ethan: add==14
观察Log日志,发现add=14,证明了完美的实现了封装IBinder接口进行通信。由于懒服务端就不封装了。
浅析aidl的使用和工作原理(代码片段)
AIDL是一种接口定义语言,用于生成可在Android设备上两个进程之间进行进程间通信(IPC)的代码。AIDL的使用新建一个aidl文件,定义进程间通信的接口//IStudentManager.aidlpackagecom.tellh.androidart;//Declareanynon-defaulttypesherewithimportstatem... 查看详情
aidl原理分析(代码片段)
...直在Framework和应用层上扮演着很重要的角色,今日且将其原理简单分析。(文2020.03.30)一、开篇介绍1.简单介绍Android系统中对原理的分析基本离不开对源码的阅读,我理解的原理分析:原理分析=基本概念+源码分析+实践正如创... 查看详情
浅谈k8s:k8s部署架构以及工作原理(代码片段)
对于每个想落地kubernetes应用的工程师来说,熟悉kubernetes的架构和工作原理是必经之路,也是必须知道的知识,只有了解kubernetes的架构和工作原理才能更好的应用kubernetes。kubernetes架构Kubernetes最初源于谷歌内部的Borg,提供了面... 查看详情
安卓ipc之aidl使用---systemaidl调用
安卓IPC之aidl使用(三)—Systemaidl调用安卓IPC之aidl使用(一)–aidl常见使用安卓IPC之aidl使用(二)—aidl本地实现AIDL的理解:Service中的IBinder还记得我们在MyService中利用newIMyInterface.Stub()向上转型成了IBinder然后在onBind方法中返回... 查看详情
借助aidl进行ipc
使用AIDL进行跨进程间通信本文主要包含如下内容:AIDL的介绍AIDL的适用场景如何定义AIDL如何调用AIDL传递复杂对象调用IPC方法AIDL的介绍AIDL(Android接口定义语言),可以利用它定义客户端与服务使用进程间通信IPC... 查看详情
ipc之aidl的使用(代码片段)
一、AIDL知识储备 1.AIDL文件支持的数据类型: 基本数据类型(int,long,char,boolean,double等); String和CharSequence; List:只支持ArrayList,里面每个元素都必须能够被AIDL支持; Map:只支持HashMap,里面每个元素都必须能... 查看详情
安卓ipc跨进程通讯:aidl+retrofit——andlinker的初步使用
...时候,AndLinker是一款Android上的IPC(进程间通信)库,结合了AIDL和Retrofit的诸多特性,且可以与RxJava和RxJava2的CallAdapters无缝结合使用。个人简单理解就是:简化AIDL流程的一个第三方库。使用时需要先了解一下AIDL、retrofit。以普通Java... 查看详情
ipc_aidl的基本使用过程
AIDL全称AndroidInterfacedefinitionlanguage的缩写,顾名思义,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.下面是AIDL的详细使用过程。简单起见,就完成一个客户端调用服务端ÿ... 查看详情
ipc—一张图解释messenger的设计思想
Aidl和Messanger是Android中常用的IPC方式。首先,Aidl内部是基于Binder的,而Messenger内部又是基于Aidl的。但是messenger和Aidl还是有所区别的。学习Aidl的时候常会看到:“UsingAIDLisnecessaryonlyifyouallowclientsfromdifferentapplications 查看详情
ipc利用纯binder通信(非aidl)
在Android中,当两个类都在同一个进程里执行时,两者之间的沟通,只要采取一般的函数调用(FunctionCall)就行了,既快速又方便。一旦两个类分别在不同的进程里执行时,两者之间的沟通,就不能采取一般的... 查看详情
客户端进程(在带有aidl的android IPC中)如何知道远程服务器类?
】客户端进程(在带有aidl的androidIPC中)如何知道远程服务器类?【英文标题】:Howaclientprocess(inandroidIPCwithaidl)beawareofremoteseverclass?【发布时间】:2019-04-1509:16:06【问题描述】:在Android官方Aidl文档中,IPC客户端示例以“RemoteServic... 查看详情
andorid总结-aidl
使用AIDL的必要条件是你允许来自不同应用的client来访问你的service做IPC的操作,并且需要处理多线程的情况。如果你不要做跨进程的IPC,那么你应该使用“ExtendingtheBinderclass”方法,参考Andorid总结-BoundServices如果需要... 查看详情
浅谈react工作原理
Reactjs起源于Facebook内部项目,是一个用来构建用户界面的javascript库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React把每一个组件当成了一个状态机,组件内部通过state来维护组件状态的变化,当组件的状态发生变... 查看详情
android中的ipc方式——aidl
上一篇介绍了用Messenger来进行进程间通信的方法,可以发现,Messenger是以串行的方式处理客户端发来的信息的,如果有大量消息同时发到服务端,服务端只能一个一个处理,如果有大量信息的并发请求,那... 查看详情
Android Couchdb - libcouch 和 IPC Aidl 服务
】AndroidCouchdb-libcouch和IPCAidl服务【英文标题】:AndroidCouchdb-libcouchandIPCAidlServices【发布时间】:2011-02-0123:17:23【问题描述】:我正在开发一个带有android的原生CouchdDB应用程序。就在本周,CouchOne发布了libcouch,被描述为“在Android... 查看详情
aidl跨进程通信
注:慕课网详细教程:http://www.imooc.com/learn/606 一、线程通信应用场景AIDL IPC 多个应用程序 多线程Binder IPC 多个应用程序 没有多线程Messenger IPC 没有多线程什么是IPC:http://www.jianshu.com/p/c0a5bdbba3c 查看详情
广播接收器,aidl和messenger有什么区别?(代码片段)
有人可以区分使用广播接收器,AIDL(Android接口定义语言)和信使的场景吗?我被告知使用广播接收器是电池耗尽所以我不应该使用它。AIDL和信使用于IPC(进程间通信),但我可以使用AIDL方式将数据从服务传递到同一进程中的... 查看详情
aidl实现原理(代码片段)
...ndroid进程通信之AIDL》,但是一直没有补充对应的实现原理“引言说实在的,AIDL跨进程方式用得比较少,也一直比较神秘,这篇文章将剖析AIDL的通信过程,开车!一、AIDL的用法列一下本文用到的AIDL通信方... 查看详情