一 概念

讲stable AIDL之前,先提及以下概念:

序列化:进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。也就是将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 ,反序列化就是从二进制流(序列)转化为对象的过程。

Bundle:是一种key-value的形态,旨在存取数据。

Intent:用于组建间的数据传递,底层是由Bundle实现,可以在IPC下进行传递,旨在传递数据。Intent.putExtra/getExtra和Bundle的put和get方法一一对应。

Intent和Bundle用法对比

假设需要将数据从页面A传递到B,然后再传递到C。

A页面中:

Intent intent=new Intent(MainActivity.this,BActivity.class);
{//Intent方式
intent.putExtra("String","MainActivity中的值");
intent.putExtra("int",11);
}
{//bundle方式
Bundle bundle = new Bundle();
bundle.putString("String","MainActivity中的值");
bundle.putInt("int",11);
intent.putExtra("bundle",bundle);
}
startActivity(intent);

B页面中:

需要先在B页面中接收数据

Intent intent = getIntent();
{//Intent方式
string = intent.getStringExtra("String");
key = intent.getIntExtra("int",0);
}
{//bundle方式
bundle=intent.getBundleExtra("bundle");
}

然后再发数据到C页面

Intent intent=new Intent(BActivity.this,CActivity.class);
{//Intent方式
intent.putExtra("String1",string);
intent.putExtra("int1",key);
intent.putExtra("boolean",true);
}
{//bundle方式bundle.putBoolean("boolean",true);intent.putExtra("bundle1",bundle);
}
startActivity(intent);

可以看到,使用的时候不方便的地方是需要在B页面将数据一条条取出来然后再一条条传输给C页面。

而使用Bundle的话,在B页面可以直接取出传输的Bundle对象然后传输给C页面。

Serializable:Java为我们提供的一个标准化的序列化接口,可能会频繁的IO操作

Parcelable:Android为我们提供的系列化接口,Parcelable相对于Serializable的使用相对复杂一些,但效率号称比serializable快10倍。实现Parcelable的作用有3个:

1)永久性保存对象,保存对象的字节序列到本地文件中;

2)通过序列化对象在网络中传递对象;

3)通过序列化在进程间传递对象。

Parcel:包装了我们需要传输的数据,然后在Binder中传输,用于跨进程传输数据。Parcel提供了一套机制,可以将序列化之后的数据写入到一个共享内存中,其他进程通过Parcel可以从这块共享内存中读出字节流,并反序列化成对象。

Parcel可以包含原始数据类型(用各种对应的方法写入,比如writeInt(),writeFloat()等),可以包含Parcelable对象,它还包含了一个活动的IBinder对象的引用,这个引用导致另一端接收到一个指向这个IBinder的代理IBinder。Parcelable通过Parcel实现了read和write的方法,从而实现序列化和反序列化 。

Parcelable和Serializable的区别和比较

Parcelable和Serializable都是实现序列化并且都可以用于Intent间传递数据,Serializable是Java的实现方式,可能会频繁的IO操作,所以消耗比较大,但是实现方式简单 Parcelable是Android提供的方式,效率比较高,但是实现起来复杂一些 , 二者的选取规则是:内存序列化上选择Parcelable, 存储到设备或者网络传输上选择Serializable(当然Parcelable也可以但是稍显复杂)

选择序列化方法的原则

1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

二 stable AIDL与AIDL区别

1)自动支持 Parcelable

AIDL 传递数据要自己实现 Parcelable接口

Stable AIDL 只需要声明传递数据的结构,编译系统负责实现 Parcelable
2) API 版本化
Stable AIDL 接口稳定后,可通过 m <module name>-freeze-api 进行 freeze 操作

AIDL 接口被打上版本号并归档。

3)Stable AIDL 默认支持如下接口方法:
- getInterfaceVersion:查询接口的版本号
- setDefaultImpl:当 client 使用的 aidl 版本比 server 新,调用 server 未实现的方法时,会触发默认实现的方法

aidl_interface{

name:模块的名称
local_include_dir:包开始的路径
srcs:将被编译成目标语言的稳定 AIDL 源文件列表
api_dir:转储以前版本接口的API定义的路径;用于确保捕获对接口的APl中断更改
version:这里列出了在api_dir下冻结的接口的以前版本。 这是可选的。

}

stable AIDL相关推荐

  1. AIDL for HALs实战

    Stable AIDL HAL 实战 背景: 官方:https://source.android.com/devices/architecture/aidl/aidl-hals. Google 在An ...

  2. [Android]Android 下实现点亮 Led

    Android 下的实现点亮 led 1 准备驱动 1.1 修改设备树 在设备树中添加节点,在 / 节点下添加 led_test 节点,在 &iomuxc 节点下添加 led_test 的 p ...

  3. 【转】AndroidQ新特性

    前言 Android Q致力于让用户控制.保护个人数据,确保透明度. [外链图片转存失败(img-btiqSYXg-1568285151835)(https://fossbytes.com/wp-co ...

  4. Android 11 热点(softap)流程分析(二) WifiManager--AIDL

    Android 10以后引入了stable aidl方法,结合上一篇中WifiManager类中通过aidl调用到WifiServiceImpl类中方法,做个详细的记录. 一.frameworks/b ...

  5. Android11添加AIDL系统服务及HIDL接口服务

    软件平台:Android11 硬件平台:QCS6125 直接上需求:首先添加自定义系统服务并且开机自启动:其次该服务要调用HW层service的方法. 前半部分之前添加过N次,不是难点,后半部分的实现 ...

  6. Android应用中通过AIDL机制实现进程间的通讯实例

    Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达 ...

  7. android AIDL IPC深入分析

    深入分析AIDL原理 博客分类: Android 在上一篇文章(Service使用方式)中,介绍了Android进程间通信(IPC)的使用,并给出了一个示例.但并没有深入分析aidl是怎样可以做到进程 ...

  8. aidl实现进程间通信

    在封装sdk的过程中,sdk是如何与app进行通信的呢? 总所周知,进程间通信,android的四大组件都是可以做到的,如果大家对其中原理有不明白的可以参照http://blog.csdn.net/t ...

  9. android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件

    关键代码task class_jar(type: Jar) { from "build/intermediates/classes/release/" //核心,将.class 文 ...

最新文章

  1. C#未来新特性:静态委托和函数指针
  2. linux 环境 安装jdk tomcat mysql git
  3. 对愤怒小鸟首席美术设计Ellinoora的访谈
  4. 无需重新部署Eclipse和Tomcat即可进行更改
  5. Android studio真机调试
  6. c++ sleep函数_C ++ strcpy()和strncpy()函数
  7. c语言中联机停止运行,Win7开机提示Microsoft(C)注册服务器已停止工作怎么办?
  8. SpringMVC学习(三)RestFul风格
  9. 安装 virtualenvwrapper
  10. Atitit 查询优化器的流程attilax总结
  11. firewalls 查看防火墙状态_5条命令玩转Linux系统防火墙
  12. C语言实现flappy bird(可视化编程)
  13. 金融行业相关知识点整理
  14. 超级好用的国际汇兑平台--Transferwise
  15. 启用mysql系统找不到指定的文件类型_net start mysql 发生系统错误2 系统找不到指定的文件...
  16. 再说for in循环
  17. 【学习笔记】IGMP snooping原理
  18. NYNU ACM 蓝桥杯选拔赛 解题报告
  19. WordPress插件冲突的解决办法
  20. MangoDB安装教程

热门文章

  1. 广州楼市:2021下半年,到底要不要尽快买房?
  2. H3C路由器动态NAT配置步骤全解析
  3. solid works方程式笔记
  4. 怎么让CAD文件中图像单独保存
  5. jstat的主要用法
  6. Windows10睡眠模式下过一段时间自动关机解决方法
  7. 【末日祭典】魔法门英雄无敌III——lanruo
  8. 启动第一个微信小程序(一)
  9. android p x6,刘海屏新机诺基亚X6发布 售价1299元起
  10. 社区活动| 明晚7点,Apache Doris 社区开发者会议与你不见不散~