Android Context 上下文對(duì)象詳解

context使用很多次了弯淘,還屬于經(jīng)常踩坑的一個(gè)點(diǎn),今天沒事(武漢加油(? ??_??)?)就總結(jié)一下,本文參考:http://blog.csdn.net/lmj623565791/article/details/40481055

context太常用了,加載資源乡恕、啟動(dòng)一個(gè)新的Activity、獲取系統(tǒng)服務(wù)俯萎、獲取內(nèi)部文件(夾)路徑傲宜、創(chuàng)建View操作時(shí)等都需要Context的參與。那么context到底是什么呢讯屈?官方解釋是上下文對(duì)象蛋哭,也就是用戶與操作系統(tǒng)交互的對(duì)象,過程涮母;包括交互的界面谆趾,以及隱藏在背后的數(shù)據(jù)信息。

從技術(shù)層面剖析context叛本,那么它是一個(gè)抽象類沪蓬,可以直接從代碼看出它的結(jié)構(gòu)是怎樣的

圖1

可以看到Activity、Service来候、Application都是Context的子類跷叉;

也就是說,Android系統(tǒng)的角度來理解:Context是一個(gè)場(chǎng)景,代表與操作系統(tǒng)的交互的一種過程云挟。從程序的角度上來理解:Context是個(gè)抽象類梆砸,而Activity、Service园欣、Application等都是該類的一個(gè)實(shí)現(xiàn)帖世。

在仔細(xì)看一下上圖:Activity、Service沸枯、Application都是繼承自ContextWrapper日矫,而ContextWrapper內(nèi)部會(huì)包含一個(gè)base context,由這個(gè)base context去實(shí)現(xiàn)了絕大多數(shù)的方法绑榴。

理解了context之后我們看它的使用的方式:一般在avtivity中哪轿,有兩種使用方式:xxxactivity. this和getApplicationContext這兩種傳入方式,那這兩種方式有何不同呢翔怎?一般在匿名內(nèi)部類的時(shí)候不能使用. this的方式窃诉,只能使用getApplicationContext的方式,所以這兩種方式返回的對(duì)象肯定不同姓惑,一個(gè)是Activity的實(shí)例褐奴,一個(gè)是Application的實(shí)例按脚。因此這兩種方式不能亂使用于毙。

當(dāng)我們?cè)诰帉懝ぞ哳惖臅r(shí)候常常需要context的參與去訪問資源,訪問系統(tǒng)管理類等辅搬,這樣的情況下就要注意context的使用了唯沮。

這種工具類內(nèi)部保持了一個(gè)Context的引用;這個(gè)Context哪來的我們不能確定堪遂,很大的可能性介蛉,你在某個(gè)Activity里面為了方便,直接傳了個(gè)this溶褪;這樣問題就來了币旧,我們的這個(gè)類中的sInstance或者方法是一個(gè)static且強(qiáng)引用的,在其內(nèi)部引用了一個(gè)Activity作為Context猿妈,也就是說吹菱,我們的這個(gè)Activity只要我們的項(xiàng)目活著,就沒有辦法進(jìn)行內(nèi)存回收彭则。而我們的Activity的生命周期肯定沒這么長(zhǎng)鳍刷,所以造成了內(nèi)存泄漏。這時(shí)候你說改成軟引用俯抖,這樣暫時(shí)沒問題了输瓜,但是activity被回收了怎么辦呢,就會(huì)造成拋出NullPointException的異常。又說那全部改成getApplicationContext就沒有問題了尤揣,好我們暫時(shí)解決了內(nèi)存泄露的問題搔啊。

但是又有一個(gè)問題,上面說了activity的context和application的context的使用場(chǎng)景雖然有些重合場(chǎng)景北戏,但還是有不同的地方坯癣。并非所有Activity中的context都可以用application Context來表示。


下面列出context的應(yīng)用場(chǎng)景

圖2

大家注意看到有一些NO上添加了一些數(shù)字最欠,其實(shí)這些從能力上來說是YES示罗,但是為什么說是NO呢?下面一個(gè)一個(gè)解釋:

數(shù)字1:?jiǎn)?dòng)Activity在這些類中是可以的芝硬,但是需要?jiǎng)?chuàng)建一個(gè)新的task蚜点。一般情況不推薦。

數(shù)字2:在這些類中去layout inflate是合法的拌阴,但是會(huì)使用系統(tǒng)默認(rèn)的主題樣式绍绘,如果你自定義了某些樣式可能不會(huì)被使用。

數(shù)字3:在receiver為null時(shí)允許迟赃,在4.2或以上的版本中陪拘,用于獲取黏性廣播的當(dāng)前值。(可以無視)

注:ContentProvider纤壁、BroadcastReceiver之所以在上述表格中左刽,是因?yàn)樵谄鋬?nèi)部方法中都有一個(gè)context用于使用。

好了酌媒,這里我們看下表格欠痴,重點(diǎn)看Activity和Application,可以看到秒咨,和UI相關(guān)的方法基本都不建議或者不可使用Application喇辽,并且,前三個(gè)操作基本不可能在Application中出現(xiàn)雨席。實(shí)際上菩咨,只要把握住一點(diǎn),凡是跟UI相關(guān)的陡厘,都應(yīng)該使用Activity做為Context來處理抽米;其他的一些操作,Service,Activity,Application等實(shí)例都可以雏亚,當(dāng)然了缨硝,注意Context引用的持有,防止內(nèi)存泄漏罢低。

至此查辩,Context的分析基本完成了胖笛,希望大家在以后的使用過程中,能夠稍微考慮下宜岛,這里使用Activity合適嗎长踊?會(huì)不會(huì)造成內(nèi)存泄漏?會(huì)不會(huì)拋出異常萍倡?

今天的分析到此結(jié)束

~~~~~~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末身弊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子列敲,更是在濱河造成了極大的恐慌阱佛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戴而,死亡現(xiàn)場(chǎng)離奇詭異凑术,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)所意,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門淮逊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扶踊,你說我怎么就攤上這事泄鹏。” “怎么了秧耗?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵备籽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我绣版,道長(zhǎng)胶台,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任杂抽,我火速辦了婚禮,結(jié)果婚禮上韩脏,老公的妹妹穿的比我還像新娘缩麸。我一直安慰自己,他們只是感情好赡矢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布杭朱。 她就那樣靜靜地躺著,像睡著了一般吹散。 火紅的嫁衣襯著肌膚如雪弧械。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天空民,我揣著相機(jī)與錄音刃唐,去河邊找鬼羞迷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛画饥,可吹牛的內(nèi)容都是我干的衔瓮。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼抖甘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼热鞍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衔彻,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤薇宠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后艰额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼接,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年悴晰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慢睡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铡溪,死狀恐怖漂辐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棕硫,我是刑警寧澤髓涯,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站哈扮,受9級(jí)特大地震影響纬纪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滑肉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一包各、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靶庙,春花似錦问畅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掏击,卻和暖如春卵皂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砚亭。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工灯变, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殴玛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓柒凉,卻偏偏與公主長(zhǎng)得像族阅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膝捞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容