关于Android中aidl的关键词in,out,inout的探索
2017-10-31 11:22
363 查看
第一问:aidl是啥
aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口Aidl在安卓进程间通讯(IPC)的常用手段,因为其可以并行通讯而相对于用Messager(Handler)进行串行通讯要适应需求。
基本原理步骤是
服务端:
1、创建Service的aidl,在接口中构造几个方法用于来暴露给客户端进行调用。注意:这里的数据类型只能是:
①java的基本数据类型;
②其他aidl接口,必须import;
③string和charsequence;
④实现了Paracelable接口的自定义实体类,其实体类中需要添加一个Creator<类名> XXX = new Creator<类名>的变量。,然后还需要创建其对应的xxx.aidl文件,包含一句话:parcelable xxx;
⑤list或者map,它们可以不用import,但是其中允许的数据必须是上面的①③④类型,而且如果是④要有import;
⑥需要注意的是上面的数据类型中出了①和③,其他的都必须要有in out inout这种关键词。这些关键词下面再详细解释。
2、创建service,其中需要构造一个实现了上面aidl生成的.java类的.Stub服务桩类(stub是aidl的具体实现。aidl安卓接口定义语言,主要是实现进程间通信,stub在服务端实现接口的功能,另外在客户端是proxy与之通信),其中实现了之前我们在第一步中接口内构造的几个方法,在这里我们对这些数据进行一些处理,然后设定返回值。之后在onbind中返回这个服务桩类!
客户端:
1、将上面第一步构造的aidl文件(所有)和用到的实体类复制到客户端目录下,然后通过bindService方式用intent启动service(注意这里5.0之后需要给Intent setAction和setPackage才可以)。2、然后在ServiceConnection中通过xxx类(aidl生成的).Stub.asInterface()方法传入onServiceConnected的IBinder参数就可以拿到这个Service。
3、之后就可以调用这个aidl接口中的方法向服务端发送数据给他处理,然后获取一些返回值。
好了,接下来讲讲in out inout的区别
这个关键词主要是用来控制数据流向的,这里的流向,请注意和返回值无关!!!返回值一点也不会受影响!in:
表示这个传入的对象A a只能由客户端传入服务端,其本身作为方法的参数,不会有任何改变!out:
表示这个传入的对象无法由客户端流入服务端,就是说服务端无法接收到这个消息,但是这个对象会因为服务端对其赋值等改变而改变,就是说有方法P(),P(a)不会导致服务器接收到这个数据,但是服务器如果对这个a进行操作,那么客户端的这个P方法中的a也会随之改变!inout:
结合上面两个的理解,可以知道是既可以由客户端传入服务端,又会因为服务端对这个对象进行的操作处理而使得客户端的对象a发生改变。相关文章推荐
- 关于aidl参数方向in,out,inout网上的解释
- [Android]AIDL中的in,out,inout理解
- Android AIDL之in out inout
- android AIDL : 你真的理解AIDL中的in,out,inout么?
- android-----关于通过AIDL注册监听之后无法解除监听的探索
- Android AIDL中的in,out,inout含义
- android aidl in out
- 关于AIDL中的in、out和inout修饰符
- Android远程接口之AIDL——Parcelable、in、out、inout简例
- 关于android分支无法下载的问题,revision froyo in manifests not found
- Android in-app billing: 关于 RESTORE_TRANSACTIONS
- Android 关于资源编译优化的构想,目前仅仅是探索阶段
- Android中的PID,TID和UID (关于AIDL的demo)
- 关于android编程遇到java.lang.OutOfMemoryError: bitmap size exceeds VM budget此类问题的原因及解决办法
- 关于android分支无法下载的问题,revision froyo in manifests not found
- 关于如何避免Android中Bitmap引起的OutOfMemoryError
- Android关于OutOfMemoryError的一些思考
- 关于LWIP在应用中遇到的一个问题memp_malloc: out of memory in pool TCP_PCB
- android关于类在序列化以及AIDL中的若干总结点
- AIDL 编译报can be an out parameter, so you must declare it as in, out or inout原因探究