Android面試一天一題(9 Day)

面試題:兩個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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,702評論 2 380

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,806評論 25 708
  • 本文出自 Eddy Wiki ,轉載請注明出處:http://eddy.wiki/interview-androi...
    eddy_wiki閱讀 3,296評論 0 20
  • 1.什么是Activity?問的不太多,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應一個activit...
    JoonyLee閱讀 5,754評論 2 51
  • 歷史景點的講解??腿藖碜晕搴暮#蟮玫降囊膊煌?,需求也不一樣。所以要根據不同的客人,語言,心理,美學等。 選擇...
    xmlovess閱讀 735評論 0 0
  • 水的流年里 光影浮動 淡淡的離愁別緒 經年 便傷痕累累 你在意的那樹花 開了又謝 滿腹的心事 只相約一個 沒有晚霞...
    不惑而歌閱讀 212評論 5 12