有些東西,大家天天都能看到驾茴,但并不一定了解和在意它盼樟。在Android開發(fā)中,加載資源锈至,啟動一個新的Activity晨缴,獲取系統(tǒng)服務,獲取數(shù)據(jù)庫路徑峡捡,創(chuàng)建一個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”為“上下文械拍,背景,環(huán)境射沟,語境”殊者,有點抽象。對照上面的英文验夯,也很容易理解它的意思:Context提供了一個應用的運行環(huán)境猖吴,通過這個上下文應用才可以訪問資源,才能完成和其他組件挥转、服務的交互海蔽。它就是一個調(diào)用者和具體實現(xiàn)的橋接。
再看看這個圖绑谣,可以直觀的了解Context相關類的繼承關系:
具體的實現(xiàn)党窜,大家可以看一看ContextImpl這個類的源碼,理一下它和LoadApk的關系借宵,大家就會很容易明白Context是如何處理資源的幌衣。
注意:上圖中的mPackageInfo是一個LoadApk對像,這個LoadApk是一個hide類型的類壤玫,所以你在SDK中是找不到它的豁护。
但是,面對天天見的“大眾臉同學”Context欲间,很多人更想知道楚里,理解它有什么實際的意義。做應用開發(fā)猎贴,我們只要會使用它不就行了嗎班缎?
我先問一個簡單的問題:
Application(或者Service)和Activity都可以調(diào)用Context的startActivity方法蝴光,那么在這兩個地方調(diào)用startActivity有區(qū)別嗎?
如果你曾經(jīng)遇到過达址,就會知道在Application(或者Service)需要給Intent設置Intent.FLAG_ACTIVITY_NEW_TASK才能正常啟動Activity蔑祟,這就會引出Activity的Task棧問題,以后再做分析沉唠。
理解Context做瞪,對于我經(jīng)歷的項目來說,最有用的就是對于插件框架的開發(fā)了右冻。如果有面試官問你:
Context的實例是什么時候創(chuàng)建的?一個應用里面會有幾個Context的實例著拭?
對于一般的應用來說纱扭,你會覺得這兩個問題很無聊。但如果你需要做插件開發(fā)儡遮,上面的問題就變成是很關鍵的問題了乳蛾。你的插件框架會是一個小型的Android Framework層,你當然得自己處理插件的Application和Activity創(chuàng)建鄙币,那么你肯定要解決好這兩個問題肃叶。詳情可以查看ActivityThread這個類的源碼。
也就是說十嘿,如果我要招一個做插件開發(fā)的人因惭,我肯定要了解一下他對這些問題的看法〖ㄖ裕或者一個人的簡歷上說他對Android Framework層很精通蹦魔,也可以拿這些問題檢測一下。
小結
有網(wǎng)友問“面試官是怎么考慮求職者的經(jīng)驗咳燕、學歷勿决、編程水平”這些方面的,其實這個問題不能脫離實際的公司和項目來回答招盲。我只能說幾個場景低缩,有些公司有人才培養(yǎng)計劃項目也不緊張,那么他們在招人時是以培養(yǎng)和貯備為目的曹货,會更重視面試者的理解和學習能力咆繁。但如何一家公司急切需要人進來解決問題,他們就會更在乎你的項目經(jīng)驗了控乾,最好是直接招以前就做過類似項目的么介。如果一家公司只是需要碼農(nóng)來搬代碼,那么只要不是太差的蜕衡,他們會更看重性價比壤短。
所以有公司關注這些對Context或Framework方面的理解的面式題设拟,一是他們應用可能遇到了一些問題,需要一些對機制比較了解的開發(fā)來解決久脯;二是想通過這類問題纳胧,考察面試者是否真如簡歷上般資深,因為他們相信做多了項目的人帘撰,很容易遇到機制方面的問題(如Dex的65535方法數(shù)限制)跑慕。