Android面試中常問的Context筆錄

Android技術(shù)面試確實(shí)常常被問到Context哈~~~大概問題就是,說說你對Context的理解吧,我還真遇到過,腦袋里浮現(xiàn)了是原來看到的文章片段,亂說一通,哈哈哈。這樣還是不行,不好。平時(shí)呢,還是多積累知識(shí)吧,深刻理解Context,在自己項(xiàng)目開發(fā)過程中,也能避免一些陷入坑中,So,好好學(xué)習(xí),天天向上,多做筆記。O(∩_∩)O哈!

喜歡標(biāo)題旁邊來張我最愛的仙劍圖片(????)自己的簡書空間真好,隨意放入自己喜歡的內(nèi)容,按照自己的習(xí)慣做筆記。

圖片取自網(wǎng)絡(luò)

Context,在翻譯為上下文,也可以理解為環(huán)境,是提供一些程序的運(yùn)行環(huán)境基礎(chǔ)信息?;旧显陂_發(fā)項(xiàng)目的時(shí)候,時(shí)刻都有接觸到。Android程序不像Java程序,隨便創(chuàng)建一個(gè)類,寫個(gè)main()方法就能跑,而是要有一個(gè)完整的Android工程環(huán)境,在這個(gè)環(huán)境下,有像Activity、Service、BroadcastReceiver等系統(tǒng)組件,而這些組件并不是像一個(gè)普通的Java對象new一下就能創(chuàng)建實(shí)例的了,而是要有它們各自的上下文環(huán)境,也就是Context??梢哉fContext是維持Android程序中各組件能夠正常工作的一個(gè)核心功能類。

Context是個(gè)抽象類,下圖取自網(wǎng)絡(luò),可以看到Context的繼承結(jié)構(gòu)。

圖片取自網(wǎng)絡(luò)
截圖取自 http://www.android-doc.com/reference/android/content/Context.html

ContextWrapper是上下文功能的封裝類,而ContextImpl則是上下文功能的實(shí)現(xiàn)類。而ContextWrapper又有三個(gè)直接的子類, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一個(gè)帶主題的封裝類,而它有一個(gè)直接子類就是Activity,所以Activity和Service以及Application的Context是不一樣的,只有Activity需要主題,Service不需要主題。

Context一共有三種類型,分別是Application、Activity和Service。這三個(gè)類雖然分別各種承擔(dān)著不同的作用,但它們都屬于Context的一種,而它們具體Context的功能則是由ContextImpl類去實(shí)現(xiàn)的,因此在絕大多數(shù)場景下,Activity、Service和Application這三種類型的Context都是可以通用的。不過有幾種場景比較特殊,比如啟動(dòng)Activity,還有彈出Dialog。出于安全原因的考慮,Android是不允許Activity或Dialog憑空出現(xiàn)的,一個(gè)Activity的啟動(dòng)必須要建立在另一個(gè)Activity的基礎(chǔ)之上,也就是以此形成的返回棧。而Dialog則必須在一個(gè)Activity上面彈出(除非是System Alert類型的Dialog),因此在這種場景下,我們只能使用Activity類型的Context,否則將會(huì)出錯(cuò)。

Context應(yīng)用場景:

圖片取自網(wǎng)絡(luò)

NO上數(shù)字含義:

  1. 一個(gè)非Activity的Context可以用于啟動(dòng)一個(gè)Activity,但這樣啟動(dòng)的Activity需要新創(chuàng)建一個(gè)Activity堆疊棧。這個(gè)在某些特定情形下或許會(huì)適用,一般情況不推薦。
  2. 這個(gè)其實(shí)也是可以的,但是這樣導(dǎo)入的布局會(huì)用當(dāng)前系統(tǒng)的默認(rèn)主題來設(shè)置,若是自定義了某些樣式可能不會(huì)被使用。
  3. 在Android 4.2及以上的系統(tǒng)里,若receiver為null,則允許,用于獲取黏性廣播的當(dāng)前值。
  • 每一個(gè)Activity和Service以及Application的Context都是一個(gè)新的ContextImpl對象。

  • getApplication()用來獲取Application實(shí)例的,但是這個(gè)方法只有在Activity和Service中才能調(diào)用的到。那么也許在絕大多數(shù)情況下我們都是在Activity或者Service中使用Application的,但是如果在一些其它的場景,比如BroadcastReceiver中也想獲得Application的實(shí)例,這時(shí)就可以借助getApplicationContext()方法,getApplicationContext()比getApplication()方法的作用域會(huì)更廣一些,任何一個(gè)Context的實(shí)例,只要調(diào)用getApplicationContext()方法都可以拿到我們的Application對象。

  • getBaseContext()方法得到的是一個(gè)ContextImpl對象。Application、Activity這樣的類其實(shí)并不會(huì)去具體實(shí)現(xiàn)Context的功能,而僅僅是做了一層接口封裝而已,Context的具體功能都是由ContextImpl類去完成的。

  • Context數(shù)量 = Activity數(shù)量 + Service數(shù)量 + 1 (1為Application)

  • 最后注意下Context的引用,防止內(nèi)存泄露問題,還有關(guān)于Context源碼分析,網(wǎng)上還是很多資料可參考的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容