binder机制实现的IPC和共享内存的方式不同,它采取的是值拷贝的方式,即进程间传递的实体遵循Parcelable协议,

Bp端负责向Parcel里写东西,Bn端负责从Parcel里读取还原,顺序是双方约定的。原型如下,Bp/Bn端收到的其实
都只是彼此的clone
Aidl(Android Interface Definition Language)简化了binder的使用,做了大量封装
但Aidl默认支持的类型包括Java 原始类型(如int、long、boolean等) 和 基础封装类型(如String、List、Map、CharSequence),
为便于阐释AIDL是如何支持自定义类型传递,写了一个demo,下载地址如下:
http://files.cnblogs.com/files/tonybright/service.zip
下面的分析基于这个demo进行,MyActivity需启动TonyService,并通过setEmployee接口,传递一个employee对象过去,然后调用getEmployeeInfo获取
employee信息。
1.自定义类型需要实现Parcelable接口,override writeToParcel这个api,这个会在将实体写入Parcel时使用
MainActivity调用setEmployee的代码如下:
mService.setEmployee是一个binder调用,具体实现可以看ITonyService.setEmployee(Bp端)
 
2.自定义类型中需要定义一个名为CREATOR的静态变量,其实现Parcelable.Creator接口及方法,
它的作用是在Binder Bn端读取parcel时用于构建Employee实例。代码实现在ITonyService.setEmployee(Bn端)
这个静态实例CREATOR是在aidl中约定好的,因此不能换成其他名字。
 
3.为自定义类Employee创建一个同名aidl声明文件Employee.aidl,如下:
package com.example.service;
parcelable Employee;
 
4.使用Employee的service aid文件ITonyService.aidl中声明方式如下:
其中in表示输入参数。
5.Android Studio或Intellij中有自动生成parcellable类的插件:Android Parcellable code generator,比较方便。  

Binder AIDL中自定义类型传递的源码分析的更多相关文章

  1. RocketMQ中Broker的HA策略源码分析

    Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...

  2. client-go客户端自定义开发Kubernetes及源码分析

    介绍 client-go 是一种能够与 Kubernetes 集群通信的客户端,通过它可以对 Kubernetes 集群中各资源类型进行 CRUD 操作,它有三大 client 类,分别为:Clien ...

  3. List中的ArrayList和LinkedList源码分析

    ​ List是在面试中经常会问的一点,在我们面试中知道的仅仅是List是单列集合Collection下的一个实现类, List的实现接口又有几个,一个是ArrayList,还有一个是LinkedLis ...

  4. Fabric2.2中的Raft共识模块源码分析

    引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...

  5. 【Java】NIO中Selector的select方法源码分析

    该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...

  6. RocketMQ中Broker的刷盘源码分析

    上一篇博客的最后简单提了下CommitLog的刷盘  [RocketMQ中Broker的消息存储源码分析] (这篇博客和上一篇有很大的联系) Broker的CommitLog刷盘会启动一个线程,不停地 ...

  7. Flink中Idle停滞流机制(源码分析)

    前几天在社区群上,有人问了一个问题 既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗? 看到这个问题,我蒙了???? 对哈,因为我是选择上游所有流中水印最小 ...

  8. 【Android笔记】Thread类中关于join()方法的源码分析

    1.join()方法的作用: 例如有一个线程对象为Thread1,在main()方法中调用Thread1.join()方法可使得当前线程(即主线程)阻塞,而执行Thread1线程. 2.源码分析(以上 ...

  9. [源码分析]Java1.8中StringJoiner的使用以及源码分析

    [源码分析]StringJoiner的使用以及源码分析 StringJoiner是Java里1.8新增的类, 或许有一部分人没有接触过. 所以本文将从使用例子入手, 分析StringJoiner的源码 ...

随机推荐

  1. 2018.09.15 poj1734Sightseeing trip(floyd求最小环)

    跟hdu1599差不多.. 只是需要输出方案. 这个可以递归求解. 代码: #include<iostream> #include<cstdio> #include<cs ...

  2. SIM900 AT来电显示开启,一些代码

    /*Note: this code is a demo for how to using gprs shield to send sms message, dial a voice call and ...

  3. mysql报错排查总结

    mysql报错: [root@zabbix ~]# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through sock ...

  4. Fortran 数据类型

  5. IntelliJ IDEA 2017版 SpringBoot的关闭自动配置和自定义Banner

    一.关闭自动配置 在jar包下找下边的名字    设置关闭自动配置jar    多个的时候配置       二.自定义Banner   (1)网站搜索一个图案.网址:http://patorjk.co ...

  6. Java 原始类型JComboBox的成员JComboBox(E())的调用 未经过检查

    问题描述: 根据书上的代码 ,编译时候出现以下问题 自定义了一个字符数组: private String[] grades = {"1","2","3 ...

  7. (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)    Memo ...

  8. Quartus II中使用脚本转换sof到rbf文件

    1.  新建一个文本文件,保存为任意但有意义的名字,如:sof_to_rbf.bat,注意,保存时请不要使用默认的格式,应该手动从.txt切换为all files 2.  在文本中输入以下内容: %Q ...

  9. Internal Server Error - http code 500

    Eror Example 1 :  

  10. PHP Functions - arsort()

    <?php $characters = array('a','b','c','d','e','f'); arsort($characters); print_r($characters); /* ...