Android面試集錦系列(34)——兩個Activity之間如何傳遞引數?
在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記憶體中,效率要快很多。
有人比較過它們兩個的效率差別:

不同型別的資料不一定差據這麼大,但卻很直觀的展示了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
最後
在現在這個金三銀四的面試季,我自己在網上也蒐集了很多資料做成了文件和架構視訊資料免費分享給大家【 包括高階UI、效能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料 】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料獲取方式:加入Android架構交流QQ群聊:513088520 ,進群即領取資料!!!
點選連結加入群聊【Android移動架構總群】:加入群聊

資料大全