Context

前言

我們知道,Android應(yīng)用都是使用Java語言來編寫的肛著,那么大家可以思考一下,一個Android程序和一個Java程序跺讯,他們最大的區(qū)別在哪里枢贿?其實簡單點分析,Android程序不像Java程序一樣刀脏,隨便創(chuàng)建一個類局荚,寫個main()方法就能跑了,而是要有一個完整的Android工程環(huán)境,在這個環(huán)境下耀态,我們有像Activity轮傍、Service、BroadcastReceiver等系統(tǒng)組件首装,而這些組件并不是像一個普通的Java對象new一下就能創(chuàng)建實例的了创夜,而是要有它們各自的上下文環(huán)境,也就是我們這里討論的Context仙逻。

Context的相關(guān)繼承關(guān)系

Context 的相關(guān)問題

1. 在ContextWrapper中的mBase到底是什么挥下?

/**
 * Proxying implementation of Context that simply delegates all of its calls to
 * another Context.  Can be subclassed to modify behavior without changing
 * the original Context.
 */
public class ContextWrapper extends Context {
    Context mBase;

    public ContextWrapper(Context base) {
        mBase = base;
    }
    
    /**
     * Set the base context for this ContextWrapper.  All calls will then be
     * delegated to the base context.  Throws
     * IllegalStateException if a base context has already been set.
     * 
     * @param base The new base context for this wrapper.
     */
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }
    ...
}

attachBaseContext()方法其實是由系統(tǒng)來調(diào)用的,它會把ContextImpl對象作為參數(shù)傳遞到attachBaseContext()方法當(dāng)中桨醋,從而賦值給mBase對象,之后ContextWrapper中的所有方法其實都是通過這種委托的機(jī)制交由ContextImpl去具體實現(xiàn)的现斋,所以說ContextImpl是上下文功能的實現(xiàn)類是非常準(zhǔn)確的喜最。

2.Context的實例是什么時候創(chuàng)建的?一個應(yīng)用里面會有幾個Context的實例庄蹋?

根據(jù)Context 的繼承關(guān)系我們知道:Context一共有Application瞬内、Activity和Service三種類型,因此一個應(yīng)用程序中Context數(shù)量的計算公式就可以這樣寫:
Context數(shù)量 = Activity數(shù)量 + Service數(shù)量 + 1
上面的1代表著Application的數(shù)量限书,因為一個應(yīng)用程序中可以有多個Activity和多個Service虫蝶,但是只能有一個Application。
ApplicationContext 是在第一個Activity啟動或者第一個Service啟動的時候創(chuàng)建倦西。

3. Application(或者Service)和Activity都可以調(diào)用Context的startActivity方法能真,那么在這兩個地方調(diào)用startActivity有區(qū)別嗎?

如果你曾經(jīng)遇到過扰柠,就會知道在Application(或者Service)需要給Intent設(shè)置Intent.FLAG_ACTIVITY_NEW_TASK才能正常啟動Activity粉铐,這就會引出Activity的Task棧問題,以后再做分析卤档。

4. 為什么Dialog不能用Application的Context


解析:
Window: 定義窗口樣式和行為的抽象基類蝙泼,用于作為頂層的view加到WindowManager中,其實現(xiàn)類是PhoneWindow劝枣。每個Window都需要指定一個Type(應(yīng)用窗口汤踏、子窗口、系統(tǒng)窗口)舔腾。Activity對應(yīng)的窗口是應(yīng)用窗口溪胶;PopupWindow,ContextMenu琢唾,OptionMenu是常用的子窗口载荔;像Toast和系統(tǒng)警告提示框(如ANR)就是系窗口,還有很多應(yīng)用的懸浮框也屬于系統(tǒng)窗口類型采桃。
WindowManager:用來在應(yīng)用與window之間的管理接口懒熙,管理窗口順序丘损,消息等。
WindowManagerService:簡稱Wms工扎,WindowManagerService管理窗口的創(chuàng)建徘钥、更新和刪除,顯示順序等肢娘,是WindowManager這個管理接品的真正的實現(xiàn)類呈础。它運(yùn)行在System_server進(jìn)程,作為服務(wù)端橱健,客戶端(應(yīng)用程序)通過IPC調(diào)用和它進(jìn)行交互而钞。
Token:這里提到的Token主是指窗口令牌(Window Token),是一種特殊的Binder令牌拘荡,Wms用它唯一標(biāo)識系統(tǒng)中的一個窗口臼节。


答案:
那為什么一定要是Activity的Token呢?我想使用Token應(yīng)該是為了安全問題珊皿,通過Token來驗證WindowManager服務(wù)請求方是否是合法的网缝。如果我們可以使用Application的Context,或者說Token可以不是Activity的Token蟋定,那么用戶可能已經(jīng)跳轉(zhuǎn)到別的應(yīng)用的Activity界面了粉臊,但我們卻可以在別人的界面上彈出我們的Dialog,想想就覺得很危險驶兜。
如你跳到了微信界面了扼仲,這時在后臺的某個應(yīng)用里調(diào)用Dialog的show,那么微信的界面上會顯示一個Dialog促王,這個Dialog可能會讓用戶輸入密碼什么的犀盟,而用戶完全無法區(qū)分是不是微信彈出的。


參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝇狼,一起剝皮案震驚了整個濱河市阅畴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迅耘,老刑警劉巖贱枣,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颤专,居然都是意外死亡纽哥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門栖秕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來春塌,“玉大人,你說我怎么就攤上這事≈豢牵” “怎么了俏拱?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吼句。 經(jīng)常有香客問我锅必,道長,這世上最難降的妖魔是什么惕艳? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任搞隐,我火速辦了婚禮,結(jié)果婚禮上远搪,老公的妹妹穿的比我還像新娘劣纲。我一直安慰自己,他們只是感情好谁鳍,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布味廊。 她就那樣靜靜地躺著,像睡著了一般棠耕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柠新,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天窍荧,我揣著相機(jī)與錄音,去河邊找鬼恨憎。 笑死蕊退,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的憔恳。 我是一名探鬼主播瓤荔,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钥组!你這毒婦竟也來了输硝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤程梦,失蹤者是張志新(化名)和其女友劉穎点把,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屿附,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡郎逃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挺份。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褒翰。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出优训,到底是詐尸還是另有隱情朵你,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布型宙,位于F島的核電站撬呢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妆兑。R本人自食惡果不足惜魂拦,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搁嗓。 院中可真熱鬧芯勘,春花似錦、人聲如沸腺逛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棍矛。三九已至安疗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間够委,已是汗流浹背荐类。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留茁帽,地道東北人玉罐。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像潘拨,于是被迫代替她去往敵國和親吊输。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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