stable AIDL
一 概念
讲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相关推荐
- AIDL for HALs实战
Stable AIDL HAL 实战 背景: 官方:https://source.android.com/devices/architecture/aidl/aidl-hals. Google 在An ...
- [Android]Android 下实现点亮 Led
Android 下的实现点亮 led 1 准备驱动 1.1 修改设备树 在设备树中添加节点,在 / 节点下添加 led_test 节点,在 &iomuxc 节点下添加 led_test 的 p ...
- 【转】AndroidQ新特性
前言 Android Q致力于让用户控制.保护个人数据,确保透明度. [外链图片转存失败(img-btiqSYXg-1568285151835)(https://fossbytes.com/wp-co ...
- Android 11 热点(softap)流程分析(二) WifiManager--AIDL
Android 10以后引入了stable aidl方法,结合上一篇中WifiManager类中通过aidl调用到WifiServiceImpl类中方法,做个详细的记录. 一.frameworks/b ...
- Android11添加AIDL系统服务及HIDL接口服务
软件平台:Android11 硬件平台:QCS6125 直接上需求:首先添加自定义系统服务并且开机自启动:其次该服务要调用HW层service的方法. 前半部分之前添加过N次,不是难点,后半部分的实现 ...
- Android应用中通过AIDL机制实现进程间的通讯实例
Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达 ...
- android AIDL IPC深入分析
深入分析AIDL原理 博客分类: Android 在上一篇文章(Service使用方式)中,介绍了Android进程间通信(IPC)的使用,并给出了一个示例.但并没有深入分析aidl是怎样可以做到进程 ...
- aidl实现进程间通信
在封装sdk的过程中,sdk是如何与app进行通信的呢? 总所周知,进程间通信,android的四大组件都是可以做到的,如果大家对其中原理有不明白的可以参照http://blog.csdn.net/t ...
- android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
关键代码task class_jar(type: Jar) { from "build/intermediates/classes/release/" //核心,将.class 文 ...
最新文章
- C#未来新特性:静态委托和函数指针
- linux 环境 安装jdk tomcat mysql git
- 对愤怒小鸟首席美术设计Ellinoora的访谈
- 无需重新部署Eclipse和Tomcat即可进行更改
- Android studio真机调试
- c++ sleep函数_C ++ strcpy()和strncpy()函数
- c语言中联机停止运行,Win7开机提示Microsoft(C)注册服务器已停止工作怎么办?
- SpringMVC学习(三)RestFul风格
- 安装 virtualenvwrapper
- Atitit 查询优化器的流程attilax总结
- firewalls 查看防火墙状态_5条命令玩转Linux系统防火墙
- C语言实现flappy bird(可视化编程)
- 金融行业相关知识点整理
- 超级好用的国际汇兑平台--Transferwise
- 启用mysql系统找不到指定的文件类型_net start mysql 发生系统错误2 系统找不到指定的文件...
- 再说for in循环
- 【学习笔记】IGMP snooping原理
- NYNU ACM 蓝桥杯选拔赛 解题报告
- WordPress插件冲突的解决办法
- MangoDB安装教程