有些東西,大家天天都能看到,但并不一定了解和在意它。在Android開發中,加載資源,啟動一個新的Activity,獲取系統服務,獲取數據庫路徑,創建一個View等都會使用到Context。Context就像一個長著大眾臉的同學,你天天和它在一起上課,但卻說不出它是誰。
面試題:如何理解Android中的Context,它有什么用?
官方文檔對于Context的解釋:
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
中文翻譯“Context”為“上下文,背景,環境,語境”,有點抽象。對照上面的英文,也很容易理解它的意思:Context提供了一個應用的運行環境,通過這個上下文應用才可以訪問資源,才能完成和其他組件、服務的交互。它就是一個調用者和具體實現的橋接。
再看看這個圖,可以直觀的了解Context相關類的繼承關系:
具體的實現,大家可以看一看ContextImpl這個類的源碼,理一下它和LoadApk的關系,大家就會很容易明白Context是如何處理資源的。
注意:上圖中的mPackageInfo是一個LoadApk對像,這個LoadApk是一個hide類型的類,所以你在SDK中是找不到它的。
但是,面對天天見的“大眾臉同學”Context,很多人更想知道,理解它有什么實際的意義。做應用開發,我們只要會使用它不就行了嗎?
我先問一個簡單的問題:
Application(或者Service)和Activity都可以調用Context的startActivity方法,那么在這兩個地方調用startActivity有區別嗎?
如果你曾經遇到過,就會知道在Application(或者Service)需要給Intent設置Intent.FLAG_ACTIVITY_NEW_TASK才能正常啟動Activity,這就會引出Activity的Task棧問題,以后再做分析。
理解Context,對于我經歷的項目來說,最有用的就是對于插件框架的開發了。如果有面試官問你:
Context的實例是什么時候創建的?一個應用里面會有幾個Context的實例?
對于一般的應用來說,你會覺得這兩個問題很無聊。但如果你需要做插件開發,上面的問題就變成是很關鍵的問題了。你的插件框架會是一個小型的Android Framework層,你當然得自己處理插件的Application和Activity創建,那么你肯定要解決好這兩個問題。詳情可以查看ActivityThread這個類的源碼。
也就是說,如果我要招一個做插件開發的人,我肯定要了解一下他對這些問題的看法?;蛘咭粋€人的簡歷上說他對Android Framework層很精通,也可以拿這些問題檢測一下。
小結
有網友問“面試官是怎么考慮求職者的經驗、學歷、編程水平”這些方面的,其實這個問題不能脫離實際的公司和項目來回答。我只能說幾個場景,有些公司有人才培養計劃項目也不緊張,那么他們在招人時是以培養和貯備為目的,會更重視面試者的理解和學習能力。但如何一家公司急切需要人進來解決問題,他們就會更在乎你的項目經驗了,最好是直接招以前就做過類似項目的。如果一家公司只是需要碼農來搬代碼,那么只要不是太差的,他們會更看重性價比。
所以有公司關注這些對Context或Framework方面的理解的面式題,一是他們應用可能遇到了一些問題,需要一些對機制比較了解的開發來解決;二是想通過這類問題,考察面試者是否真如簡歷上般資深,因為他們相信做多了項目的人,很容易遇到機制方面的問題(如Dex的65535方法數限制)。