Android面試集錦系列(31)——通過new建立的View例項它的onSaveStateInstance會被呼叫嗎?
面試多了,總會遇到一些奇葩的事情。有一次面試一家做航空娛樂系統開發的公司,老闆是新加坡人。面試我的是一個小夥子,感覺是個小leader吧,很靦腆。他把我叫到一間堆滿飛機坐椅和螢幕的辦公室,只問了我兩分鐘就走了。問了幾個很基礎的問題,基礎到我對他的問題完全沒有印象。哥哥正在納悶還有十八般武藝沒有使呢,HR就來叫我去經理室,經理很爽快的問我要多少工資,要不要提成分紅等問題,就說要等他的新加坡老闆做決定。不到兩分鐘,經理的面試也經束了。全程都不帶自我介紹的,我在軟體園這片區這麼有名了?
第二天,新加坡老闆給我打了電話,進行了一個簡單的電話面試,雙方答成了協義,算是通過了面試。之後HR就給我發了Offer。到這時候我都感覺很神奇,然後再回頭去看看自己的簡歷,沒有出奇的地方啊,看不出是高手啊,怎麼對方這麼爽快呢?也不多瞭解瞭解,我心裡對這家公司也產生一些疑惑,沒有過五關斬六將得到的offer總感覺不踏實。後來因為現今這家公司也發了offer,權衡了一下就沒去。
和新加坡老闆電話道歉了,他感到很惋惜, 這是這麼多次面試讓我感到很無厘頭的一次,有時真想去這家公司問問是怎麼回事。
好吧,故事講完了,我們接著上一題,很多網友留言表示對View儲存狀態要設定ID這一點感興趣。有網友提了這個問題:
面試題:通過new建立的View例項它的onSaveStateInstance會被呼叫嗎?
這裡再強調一下,自定義View控制元件的狀態被儲存需要滿足兩個條件:
- View有唯一的ID;
- View的初始化時要呼叫 setSaveEnabled(true) ;
簡單看一下View狀態儲存和讀取的呼叫過程:

裡面的SparseArray(完整的引數是:SparseArray<Parcelable> )是一個KEY-VALUE的Map,KEY當然就是View的ID了。所以細看一下原始碼的呼叫過程,你一下就理解為什麼一定要給View調置一個唯一的ID了。
那好,現在回答上這個網友的問題“通過new建立的View例項它的onSaveStateInstance會被呼叫嗎?”,答案還是一樣的如果設定了ID就會。其實我們在XML檔案中配置的佈局和屬性最終都是通過LayoutInflater中的inflate方法去載入,由它去建立各個View的例項(還是用new),並根據XML檔案中的屬性設定相關的值。
我們再展開一下,如果我們定義了一個自義的Layout,在同一個介面中引用了兩次這個自定義的Layout(如下圖的myLayout1 & myLayout2),那麼它的狀態會發生什麼情況呢?

我們會發現兩個Layout的狀態被儲存了,但Layout中的每個子View狀態是相同的,被最後一個儲存的View覆蓋了。這也是為什麼我們要強調View的ID要唯一的原因。
如何解決這個問題呢?留給大家去展開吧,你是面試官的話,也可以留給來面試的人,不過這裡太細節了建議最好做為附加題讓對方試試(答不上不扣分)。
最後
在現在這個金三銀四的面試季,我自己在網上也蒐集了很多資料做成了文件和架構視訊資料免費分享給大家【 包括高階UI、效能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料 】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料獲取方式:加入Android架構交流QQ群聊:513088520 ,進群即領取資料!!!
點選連結加入群聊【Android移動架構總群】:加入群聊

資料大全