美文网首页Android开发经验谈Android技术知识Android开发
Android面试:两个Activity之间如何传递参数?

Android面试:两个Activity之间如何传递参数?

作者: 字节走动_Android | 来源:发表于2020-08-23 21:32 被阅读0次

    在Android应用中,Activity占有极其重要的地位,Activity间的跳转更是加常便饭。即然跳转(界面切换)不可避免,那么在两个Activity之间传递参数就是一个常见的需求。大多数时候,我们也就传递一些简单的int,String类型的数据,实际中也有看到传递List和Bitmap的。

    那么我们先回答这个题,如何传递参数:

    使用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();
         }
    }
    
    

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

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

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

    image

    不同类型的数据不一定差据这么大,但却很直观的展示了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了。

    结论

    对于初级的程序员来说,只要能抓住老鼠,白猫或者黑猫甚至是小狗都是没有区别的。但对于应用的流畅和体验来说,100毫秒和1000毫秒是有很大区别的。很多程序员眼里无关紧要的差别,最终在用户那儿会被几倍十几倍的放大,老板也会因为用户的投述而斥责你。因为总会有用户在用性能很差的手机,总有用户手机的使用情况很复杂(内存紧张,网络复杂等等),总有用户本人就很奇葩不会按你指定的套路出拳!当你鄙视老板不懂代码的艺术时,老板也会鄙视你不懂用户不懂细节的重要性,活该你一辈子做程序员。

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

    作者:goeasyway
    链接:https://www.jianshu.com/p/be593134eeae

    推荐阅读:
    做了六年Android,终于熬出头了,15K到31K全靠这份高级面试题+解析
    字节、腾讯,阿里Android高级面试真题汇总,会一半随便进大厂

    相关文章

      网友评论

        本文标题:Android面试:两个Activity之间如何传递参数?

        本文链接:https://www.haomeiwen.com/subject/orvwjktx.html