第一问: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发生改变。

更多相关文章

  1. Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
  2. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  3. 一种Android客户端架构设计分享
  4. Android(安卓)序列化
  5. Android(安卓)多进程通信(2) - Binder、Messenger
  6. android开发新浪微博客户端 完整攻略
  7. android 播放器 实现场景搜索 调研
  8. Android(安卓)Binder 分析——匿名共享内存(Ashmem)
  9. Android下图形系统

随机推荐

  1. Linux学习之路(1)
  2. 全面解析Linux 内核 3.10.x - 编译前的准
  3. Linux系统Oracle12.2 RAC集群实施维护_Or
  4. 【linux】Centos7 防火墙操作
  5. 鸟哥的Linux私房菜——基础学习篇(第三版)
  6. keepalived for linux(HA 高可用集群)
  7. Cerebro 一个跨平台的桌面快捷使用工具
  8. Linux Mint 17下Sublime插件Emmet的安装
  9. Linux内核源代码情景分析读书笔记(5)-关于
  10. thinkphp连接mysql数据库查询数据显示