1. 程式人生 > 其它 >宅家36天鹹魚翻身入職騰訊,已有千人收藏

宅家36天鹹魚翻身入職騰訊,已有千人收藏

面試官提了一個問題,我們來看看 A、B 和 C三位同學的表現如何吧

A

面試官:說說 Application 的作用。

A:Application 是應用程序建立後就會建立的系統元件,所以可以用它來做一些初始化操作;Application 生命週期和應用程序一樣長,所以可以用來給類庫提供 Context; 因為在所有 Context 可以獲得 Application 所以可以用來儲存和傳遞全域性變數。

面試官:你平常開發會把全域性變數放在 Application ? 那應用在後臺被回收,重新開啟的時候值丟失怎麼辦?

A:會啊,很方便, 做一下容錯判空就可以了

面試官:好的,回去等通知吧


B

面試官:說說對 Application 的理解

B:作用:做初始化操作、提供上下文。另外 Application 是一個 Context ,它直接繼承了 ContextWrapper ;這個 ContextWrapper 的成員變數 mBase 可以用來存放系統實現的 ContextImpl,這樣我們在呼叫 Application 的 Context 方法時,都是通過靜態代理的方式最終呼叫到 ContextImpl 的方法。我們呼叫 ContextWrapper 的 getBaseContext 方法就能拿到 ContextImpl 的例項

面試官:你平常開發會把全域性變數放在 Application ? 那應用在後臺被回收,重新開啟的時候值丟失怎麼辦?

B:不會,儲存全域性變數用靜態變數,或單例可以把它們聚集在更合適的位置。
避免應用被回收資料丟失,可以頁面傳遞引數時,通過 Intent 傳遞引數,這樣被回收後開啟重新從 Intent 取參還是有值的。資料量大的話也可以考慮資料持久化;另一個方法是通過 onSaveInstanceState 和 onRestoreInstanceState 分別在被回收時儲存相應的資料以及在重新開啟時恢復資料。

面試官:講一下 Application 的生命週期吧

B:相比 Activity ,Application 的生命週期簡直不要太簡單。首先建立的時候會呼叫建構函式,然後系統準備好 ContextImpl 通過 attachBaseContext( Context ) 方法注入到 Application,接著呼叫我們最熟悉的 onCreate 方法。API 裡還有一個 onTerminate 方法在程序被殺死的時候會回撥,不過僅在模擬器生效,就不需要關注了。

面試官:那你能接著說一下 Application 的初始化流程嗎?

B:基本上就是上面說的那些,再細沒有去了解了

面試官:好的,回去等通知吧


C

面試官:說一下 Application 的初始化流程

C:Application 的初始化是在應用程序建立完成後:

ActivityThread 呼叫 AMS 的 Binder 物件( IActivityManager )的 attachApplication 方法
AMS 收到請求後再去呼叫 ActivityThread 的 bindApplication 方法
ActivityThread 這邊收到請求再組裝一個 AppBindData 物件,把所有引數封裝進去,再通過 handler 發到主執行緒執行

主執行緒 loop 到這條訊息,呼叫 handleBindApplication 來真正處理初始化 Application

handleBindApplication 和我們談 “Context” 那次,Activity 的初始化差不多。回顧一下:

ClassLoader 載入 Application 類,例項化
初始化 Applicaction 用的 ContextImpl
通過 Application.attach( Context ) 方法,呼叫 attachBaseContext( Context ) 將 ContextImpl 注入到 Application
最後呼叫 Application.OnCreate()

這樣 Application 就初始化完成了

面試官:為什麼程序建立完成不直接調 handleBindApplication 去建立 Application 呢,又去 AMS 那邊繞了一圈

C:呼叫 AMS 的 attachApplication 不僅僅是為了建立 Application ,還有在程序建立前可能呼叫了應用的四大元件卻沒辦法啟動;現在程序建立好了,建立好 Application 也要處理這些待啟動的元件。所以需要通過 AMS 統一排程,如果 Application 的建立及 onCreate 回撥耗時的話,也會影響這些待啟動元件的啟動時間

面試官:可以,我們再來聊聊別的。

尾聲

你不踏出去一步,永遠不知道自己潛力有多大,千萬別被這個社會套在我們身上的枷鎖給捆住了,30歲我不怕,35歲我一樣不怕,去做自己想做的事,為自己拼一把吧!不試試怎麼知道你不行呢?

改變人生,沒有什麼捷徑可言,這條路需要自己親自去走一走,只有深入思考,不斷反思總結,保持學習的熱情,一步一步構建自己完整的知識體系,才是最終的制勝之道,也是程式設計師應該承擔的使命。

附上:我們之前因為秋招收集的二十套一二線網際網路公司Android面試真題(含BAT、小米、華為、美團、滴滴)和我自己整理Android複習筆記(包含Android基礎知識點、Android擴充套件知識點、Android原始碼解析、設計模式彙總、Gradle知識點、常見演算法題彙總。)

本文已被CODING開源專案:《Android學習筆記總結+移動架構視訊+大廠面試真題+專案實戰原始碼》收錄