• Android -- 每日一问:两个 Activity 之间如何传递参数?


    在这里插入图片描述

    经典回答

    使用 Intent 的 Bundle 协带参数,就是我们常用的 Intent.putExtra 方法。

    除了传递基本类型外,如何传递自定义的对象呢?

    这个问题就是想引出 Android 的 Parcelable 。一般很多面试者都有用过传递实现了Serializable接口的自定义对象的经验,因为这个很简单,加句代码就搞定了。而Parcelable的实现要多一些代码,典型的写法如下:

    public class MyParcelable implements Parcelable {
         private int mData;
    
         public int describeContents() {
             return 0;
         }
    
         public void writeToParcel(Parcel out, int flags) {
             out.writeInt(mData);
         }
    
         public static final Parcelable.Creator<MyParcelable> CREATOR
                 = new Parcelable.Creator<MyParcelable>() {
             public MyParcelable createFromParcel(Parcel in) {
                 return new MyParcelable(in);
             }
    
             public MyParcelable[] newArray(int size) {
                 return new MyParcelable[size];
             }
         };
         
         private MyParcelable(Parcel in) {
             mData = in.readInt();
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    那我们为什么要考察对方会不会用Parcelable呢?先看一下这Parcelable和Serializable的区别:

    Serializalbe 会使用反射,序列化和反序列化过程需要大量 I/O 操作,Parcelable 自已实现封送和解封(marshalled
    &unmarshalled)操作不需要用反射,数据也存放在Native内存中,效率要快很多。

    有人比较过它们两个的效率差别:
    image.png

    不同类型的数据不一定差据这么大,但却很直观的展示了Pacelable比Serializable高效。

    有时面试官还可以追问一下:Parcelable和Parcle这两者之间的关系。

    Parcelable 接口定义在封送/解封送过程中混合和分解对象的契约。Parcelable 接口的底层是 Parcel 容器对象。Parcel类是一种最快的序列化/反序列化机制,专为 Android 中的进程间通信而设计。该类提供了一些方法来将成员容纳到容器中,以及从容器展开成员。

    现在我们知道了如何传递自定义的对象,那么在两个Activity之前传递对象还要注意什么呢?

    一定要要注意对象的大小,Intent 中的 Bundle 是在使用Binder机制进行数据传递的,能使用的 Binder 的缓冲区是有大小限制的(有些手机是2M),而一个进程默认有16个binder线程,所以一个线程能占用的缓冲区就更小了(以前做过测试,大约一个线程可以占用128KB)。所以当你看到“The Binder transaction failed because it was too large.”这类TransactionTooLargeException异常时,你应该知道怎么解决了。

    因此,使用Intent在Activity之间传递List和Bitmap对象是有风险的。

    面试官可以就这个问题再展开,看面试者如何解决。

    还有一个要注意的:因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。之前我有过一次,将Android的PackageInfo进行持久化到数据库,结果用户升级Android系统后,再从数据库解封PackageInfo时应用就Crash了。

    提示:在能使用的Parcelable的地方,请不要贪图简便直接Serializable,实在懒的话也可以试试用插件自动生成Pracelabel的模板代码:android-parcelable-intellij-plugin

    你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。

  • 相关阅读:
    【MindSpore易点通机器人-01】你也许见过很多知识问答机器人,但这个有点不一样
    【libcurl】7.84.0 : windows上的cmake构建x64 release版本
    Compose 类型稳定性注解:@Stable & @Immutable
    Hive从入门到大牛【Hive 学习笔记】
    排查 docker flow proxy 的 503 问题
    [附源码]计算机毕业设计JAVA课后作业提交系统关键技术研究与系统实现
    驱动开发之LED灯驱动开发
    面试想吊打面试官?阿里架构师教你吃透Spring(Boot、Cloud、MVC)
    非关系型数据库技术课程 第十一周作业(SpringBoot项目中使用Redis作为数据缓存,Redis的缓存机制,数据一致性、缓存穿透和缓存雪崩等问题的处理)
    GIS 制图:交互式地图的类型和应用
  • 原文地址:https://blog.csdn.net/duoduo_11011/article/details/128031583