• 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页面中:

    1. Intent intent=new Intent(MainActivity.this,BActivity.class);
    2. {//Intent方式
    3. intent.putExtra("String","MainActivity中的值");
    4. intent.putExtra("int",11);
    5. }
    6. {//bundle方式
    7. Bundle bundle = new Bundle();
    8. bundle.putString("String","MainActivity中的值");
    9. bundle.putInt("int",11);
    10. intent.putExtra("bundle",bundle);
    11. }
    12. startActivity(intent);

    B页面中:

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

    1. Intent intent = getIntent();
    2. {//Intent方式
    3. string = intent.getStringExtra("String");
    4. key = intent.getIntExtra("int",0);
    5. }
    6. {//bundle方式
    7. bundle=intent.getBundleExtra("bundle");
    8. }

    然后再发数据到C页面

    1. Intent intent=new Intent(BActivity.this,CActivity.class);
    2. {//Intent方式
    3. intent.putExtra("String1",string);
    4. intent.putExtra("int1",key);
    5. intent.putExtra("boolean",true);
    6. }
    7. {//bundle方式
    8. bundle.putBoolean("boolean",true);
    9. intent.putExtra("bundle1",bundle);
    10. }
    11. 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 -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下冻结的接口的以前版本。 这是可选的。

    }

  • 相关阅读:
    Kubernetes的基础概念
    红外小目标:DNANet网络结构与模型搭建
    STM32学习笔记:IWDG_独立看门狗
    《Linux驱动:s3c2410/s3c2440 ts驱动分析 -- 终结篇》
    EasyExcel 无法读取图片?用poi写了一个工具类
    特斯拉美国召回近1.2万辆汽车,软件Bug或导致自动刹车
    ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮几何对象
    【已解决】Unknown initial character set index ‘45‘ received from server
    微信小程序--云开发
    Pr:轨道头控件及用途
  • 原文地址:https://blog.csdn.net/wangbuji/article/details/127459338