Android面試筆記之常問(wèn)的Context
前言
Context,在翻譯為上下文,也可以理解為環(huán)境,是提供一些程序的運(yùn)行環(huán)境基礎(chǔ)信息?;旧显陂_(kāi)發(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對(duì)象new一下就能創(chuàng)建實(shí)例的了,而是要有它們各自的上下文環(huán)境,也就是Context。可以說(shuō)Context是維持Android程序中各組件能夠正常工作的一個(gè)核心功能類。
Context是個(gè)抽象類,下圖取自網(wǎng)絡(luò),可以看到Context的繼承結(jié)構(gòu)。
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ù)場(chǎng)景下,Activity、Service和Application這三種類型的Context都是可以通用的。不過(guò)有幾種場(chǎng)景比較特殊,比如啟動(dòng)Activity,還有彈出Dialog。出于安全原因的考慮,Android是不允許Activity或Dialog憑空出現(xiàn)的,一個(gè)Activity的啟動(dòng)必須要建立在另一個(gè)Activity的基礎(chǔ)之上,也就是以此形成的返回棧。而Dialog則必須在一個(gè)Activity上面彈出(除非是System Alert類型的Dialog),因此在這種場(chǎng)景下,我們只能使用Activity類型的Context,否則將會(huì)出錯(cuò)。
Context應(yīng)用場(chǎng)景:
NO上數(shù)字含義:
- 一個(gè)非Activity的Context可以用于啟動(dòng)一個(gè)Activity,但這樣啟動(dòng)的Activity需要新創(chuàng)建一個(gè)Activity堆疊棧。這個(gè)在某些特定情形下或許會(huì)適用,一般情況不推薦。
- 這個(gè)其實(shí)也是可以的,但是這樣導(dǎo)入的布局會(huì)用當(dāng)前系統(tǒng)的默認(rèn)主題來(lái)設(shè)置,若是自定義了某些樣式可能不會(huì)被使用。
- 在Android 4.2及以上的系統(tǒng)里,若receiver為null,則允許,用于獲取黏性廣播的當(dāng)前值。
每一個(gè)Activity和Service以及Application的Context都是一個(gè)新的ContextImpl對(duì)象。
getApplication()
用來(lái)獲取Application實(shí)例的,但是這個(gè)方法只有在Activity和Service中才能調(diào)用的到。那么也許在絕大多數(shù)情況下我們都是在Activity或者Service中使用Application的,但是如果在一些其它的場(chǎng)景,比如BroadcastReceiver中也想獲得Application的實(shí)例,這時(shí)就可以借助getApplicationContext()
方法,getApplicationContext()
比getApplication()
方法的作用域會(huì)更廣一些,任何一個(gè)Context的實(shí)例,只要調(diào)用getApplicationContext()
方法都可以拿到我們的Application對(duì)象。
getBaseContext()
方法得到的是一個(gè)ContextImpl對(duì)象。Application、Activity這樣的類其實(shí)并不會(huì)去具體實(shí)現(xiàn)Context的功能,而僅僅是做了一層接口封裝而已,Context的具體功能都是由ContextImpl類去完成的。
Context數(shù)量 = Activity數(shù)量 + Service數(shù)量 + 1 (1為Application)
最后注意下Context的引用,防止內(nèi)存泄露問(wèn)題,還有關(guān)于Context源碼分析,網(wǎng)上還是很多資料可參考的。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)各位Android開(kāi)發(fā)者們能有所幫助,如果有疑問(wèn)大家可以留言交流。
- Android 中Context的使用方法詳解
- Android編程實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對(duì)象的方法詳解
- Android全局獲取Context實(shí)例詳解
- Android編程實(shí)現(xiàn)為L(zhǎng)istView創(chuàng)建上下文菜單(ContextMenu)的方法
- Android context源碼詳解及深入分析
- 談?wù)凙ndroid里的Context的使用實(shí)例
- 避免 Android中Context引起的內(nèi)存泄露
- 安卓Android Context類實(shí)例詳解
- 詳解Android中的Context抽象類
- 深入解析Android App開(kāi)發(fā)中Context的用法
- Android編程獲取全局Context的方法
- Android編程中context及全局變量實(shí)例詳解
- Android中ContextMenu用法實(shí)例
- android基礎(chǔ)教程之context使用詳解
- Android獲取其他包的Context實(shí)例代碼
- android中Context深入詳解
相關(guān)文章
Android 中使用 ViewPager實(shí)現(xiàn)屏幕頁(yè)面切換和頁(yè)面輪播效果
ViewPager是谷歌官方給我們提供的一個(gè)兼容低版本安卓設(shè)備的軟件包,里面包囊了只有在安卓3.0以上可以使用的api。下面我們就展示下ViewPager可以實(shí)現(xiàn)的兩種簡(jiǎn)單效果,感興趣的朋友一起看看吧2016-12-12靈活使用Android中ActionBar和ViewPager切換頁(yè)面
這篇文章主要介紹了如何靈活使用Android中ActionBar和ViewPager切換頁(yè)面,感興趣的小伙伴們可以參考一下2015-12-12Android中通過(guò)外部程序啟動(dòng)App的三種方法
這篇文章主要介紹了Android中通過(guò)外部程序啟動(dòng)App的三種方法,本文講解了直接通過(guò)包名、通過(guò)自定義的Action、通過(guò)Scheme三種方法,并分別給出操作代碼,需要的朋友可以參考下2015-04-04Android編程獲取包名,版本信息及VersionName名稱的方法
這篇文章主要介紹了Android編程獲取包名,版本信息及VersionName名稱的方法,涉及Android包及版本相關(guān)操作函數(shù)使用技巧,需要的朋友可以參考下2016-10-10Android UTF-8轉(zhuǎn)碼實(shí)例詳解
這篇文章主要介紹了Android UTF-8轉(zhuǎn)碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03android藍(lán)牙簡(jiǎn)單開(kāi)發(fā)示例教程
大家好,本篇文章主要講的是android藍(lán)牙簡(jiǎn)單開(kāi)發(fā)示例教程,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2021-12-12Android實(shí)現(xiàn)監(jiān)聽(tīng)電話呼叫狀態(tài)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)監(jiān)聽(tīng)電話呼叫狀態(tài)的方法,涉及Android權(quán)限控制及電話狀態(tài)監(jiān)聽(tīng)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10