Context 作用垂寥、類型、使用建議 梳理

是神馬?

是一個訪問系統(tǒng)資源 和 進行應(yīng)用級別操作的 抽象接口矫废,簡稱上下文

有什么用&怎么用?

  • 創(chuàng)建新對象:new views砰蠢,adapters蓖扑,listeners
    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);

  • 訪問標(biāo)準(zhǔn)系統(tǒng)資源:Services,SharedPreferences
    AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
    getApplicationContext().getSharedPreferences(name, mode);
    getApplicationContext().getContentResolver().query(uri, ...);
    getContext().getResources().getDisplayMetrics().widthPixels * 5 / 8;

  • 進行應(yīng)用級別的操作:startActivity台舱,startService律杠,發(fā)送廣播...
    getContext().startActivity(intent);
    getContext().startService(intent);
    getContext().sendBroadcast(intent);

Context類型

  • getApplicationContext():Application的Context, 生命周期貫穿整個App
  • getContext():組件的Context,與組件生命周期同步
  • getBaseContext():(Google Android 工程師Dianne Hackborn 不建議使用竞惋,具體原因沒詳述)
  • or this (when in the Activity class)柜去,同getContext()

上述Context類型 區(qū)別主要是生命周期的不同。

使用建議

Context 使用場景對比

注:引自http://blog.csdn.net/lmj623565791/article/details/40481055

大家注意看到有一些NO上添加了一些數(shù)字拆宛,其實這些從能力上來說是YES嗓奢,但是為什么說是NO呢?下面一個一個解釋:

  • 數(shù)字1:啟動Activity在這些類中是可以的浑厚,但是需要創(chuàng)建一個新的task股耽。一般情況不推薦。

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

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

注:ContentProvider钠导、BroadcastReceiver之所以在上述表格中震嫉,是因為在其內(nèi)部方法中都有一個context用于使用。但這兩個都不會被統(tǒng)計到App context個數(shù)中辈双。

好了责掏,這里我們看下表格,重點看Activity和Application湃望,可以看到换衬,和UI相關(guān)的方法基本都不建議或者不可使用Application,并且证芭,前三個操作基本不可能在Application中出現(xiàn)瞳浦。實際上,只要把握住一點废士,凡是跟UI相關(guān)的叫潦,都應(yīng)該使用Activity做為Context來處理;其他的一些操作官硝,Service,Activity,Application等實例都可以矗蕊,當(dāng)然了短蜕,注意Context引用的持有,防止內(nèi)存泄漏傻咖。關(guān)于這一點朋魔,有如下三個建議:

  • 建議一:不要長時間持有 組件的Context,(持有的情況可能有 workThread, static 變量卿操,non-static inner Class)

  • 建議二:對于不受控的非靜態(tài)內(nèi)部類警检,建議修改成靜態(tài)內(nèi)部類,同時采用弱引用的方式 引用 Activity/Service 的Context害淤。

  • 建議三:其他可以使用Application Context 的地方扇雕,就用Application Context。

Framework實現(xiàn)

0_1330607569Vj4c.gif

面試常見問題

Q1. App 有幾個context
A:總Context實例個數(shù) = Service個數(shù) + Activity個數(shù) + 1(Application對應(yīng)的Context實例)

Q2. context 導(dǎo)致的內(nèi)存泄露窥摄?如何避免镶奉?(參考使用建議)
A:一句話描述就是:Activity 銷毀時,其他線程崭放、靜態(tài)變量腮鞍、不受控非靜態(tài)內(nèi)部類依舊持有該Activity的context 導(dǎo)致 Activity對象 內(nèi)存泄露

可以使用檢測工具
[square出品的leakcanary]https://github.com/square/leakcanary

Q3. 其他
對于第三方j(luò)ar,當(dāng)需要傳入ApplicationContext進行初始化時莹菱,最好不要將初始化過程放在Application class 中移国,因為一旦第三方初始化失敗,App啟動不了道伟,上線后迹缀,影響是致命的;即使要放在Application中也是做好異常處理蜜徽;
比如:

public class MapSDKInitActivity extends Activity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /**
     * fix:java.lang.UnsatisfiedLinkError:Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache
     */
    try {
        SDKInitializer.initialize(getApplicationContext());
    } catch (Error e) {
        MapUtils.setBaiduNotSupport(true);
    } catch (Exception e) {
        MapUtils.setBaiduNotSupport(true);
    }
}
} 

參考

[1]http://stackoverflow.com/questions/3572463/what-is-context-in-android
[2]http://blog.csdn.net/qinjuning/article/details/7310620
[3]http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
[4]http://blog.csdn.net/chenzhiqin20/article/details/8159307
[5]http://stackoverflow.com/questions/1026973/android-whats-the-difference-between-the-various-methods-to-get-a-context

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祝懂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拘鞋,更是在濱河造成了極大的恐慌砚蓬,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盆色,死亡現(xiàn)場離奇詭異灰蛙,居然都是意外死亡,警方通過查閱死者的電腦和手機隔躲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門摩梧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宣旱,你說我怎么就攤上這事仅父。” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵笙纤,是天一觀的道長耗溜。 經(jīng)常有香客問我,道長省容,這世上最難降的妖魔是什么强霎? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蓉冈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轩触。我一直安慰自己寞酿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布脱柱。 她就那樣靜靜地躺著伐弹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榨为。 梳的紋絲不亂的頭發(fā)上惨好,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機與錄音随闺,去河邊找鬼日川。 笑死,一個胖子當(dāng)著我的面吹牛矩乐,可吹牛的內(nèi)容都是我干的龄句。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼散罕,長吁一口氣:“原來是場噩夢啊……” “哼分歇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欧漱,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤职抡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后误甚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缚甩,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年窑邦,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹄胰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡奕翔,死狀恐怖裕寨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤宾袜,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布捻艳,位于F島的核電站,受9級特大地震影響庆猫,放射性物質(zhì)發(fā)生泄漏认轨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一月培、第九天 我趴在偏房一處隱蔽的房頂上張望嘁字。 院中可真熱鬧,春花似錦杉畜、人聲如沸纪蜒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纯续。三九已至,卻和暖如春灭袁,著一層夾襖步出監(jiān)牢的瞬間猬错,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工茸歧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倦炒,地道東北人。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓软瞎,卻偏偏與公主長得像析校,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铜涉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

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