Android_Context詳解
注:NO1 表示Application context的確可以開始一個(gè)Activity,但是它需要?jiǎng)?chuàng)建一個(gè)新的task。這可能會(huì)滿足一些特定的需求,但是在你的應(yīng)用中會(huì)創(chuàng)建一個(gè)不標(biāo)準(zhǔn)的回退棧(back stack),這通常是不推薦的或者不是是好的實(shí)踐。
本文引用地址:http://butianyuan.cn/article/201609/304658.htmNO2 表示這是非法的,但是這個(gè)填充(inflation)的確可以完成,但是是使用所運(yùn)行的系統(tǒng)默認(rèn)的主題(theme),而不是你app定義的主題。
NO3 在Android4.2以上,如果Receiver是null的話(這是用來獲取一個(gè)sticky broadcast的當(dāng)前 值的),這是允許的。
用戶界面UI
從前面的表格中可以看到,application context有很多功能并不是合適去做,而這些功能都與UI相關(guān)。實(shí)際上,只有Activity能夠處理所有與UI相關(guān)的任務(wù)。其他類別的context實(shí)例功能都差不多。
幸運(yùn)的是,在應(yīng)用中這三種操作基本上都不需要在Activity范圍之外進(jìn)行,這很可能是android框架故意這么設(shè)計(jì)的。嘗試顯示一個(gè)使用Aplication context創(chuàng)建的Dialog,或者使用Application context開始一個(gè)Activity,系統(tǒng)會(huì)拋出一個(gè)異常,讓你的application崩潰,非常強(qiáng)的告訴你某些地方出了問題。
一個(gè)并不明顯的問題是填充布局(inflating layout)。如果你已經(jīng)讀過了我(原文作者)的上一篇文章Layout inflation,你就已經(jīng)知道它可能是一個(gè)非常神秘過程,伴隨一些隱藏的行為。使用正確的context關(guān)系到其中的一個(gè)行為。當(dāng)你使用Application context來inflate一個(gè)布局的時(shí)候,框架并不會(huì)報(bào)錯(cuò),并返回一個(gè)使用系統(tǒng)默認(rèn)的主題創(chuàng)建一個(gè)完美的view給你,而沒有考慮你的applicaiton自定義的theme和style。這是因?yàn)锳citivity是唯一的綁定了在manifast文件種定義主題的Context。其他的Context實(shí)例將會(huì)使用系統(tǒng)默認(rèn)的主題來inflater你的view。導(dǎo)致顯示的結(jié)果并不是你所希望的。
規(guī)則的路口
可能有些讀者已經(jīng)得出兩個(gè)規(guī)則互相矛盾的結(jié)論??赡苡行┣闆r下,在某些Application的設(shè)計(jì)中,我們可能既必須長(zhǎng)期保存一個(gè)的引用,并且為了完成與UI相關(guān)的工作又必須保存一個(gè)Activity。如果出現(xiàn)這種情況,我將會(huì)強(qiáng)烈建議你重新考慮你的設(shè)計(jì),它將是一個(gè)很好的“反框架”教材。
經(jīng)驗(yàn)法則
絕大多數(shù)情況下,使用在你的所工作的組建內(nèi)部能夠直接獲取的Context。只要這個(gè)引用沒有超過這個(gè)組建的生命周期,你可以安全的保存這個(gè)引用。一旦你要保存一個(gè)context的引用,它超過了你的Activity或者Service的生命周期范圍,甚至是暫時(shí)的,你就需要轉(zhuǎn)換你的引用為Application context。
評(píng)論