自己關(guān)于Android上下文對象的理解

? Android中有個我們熟悉又陌生的對象Context(上下文),當(dāng)我們啟動Activity的時候需要上下文图呢,當(dāng)我們使用dialog的時候我們需要上下文条篷,但是上下文對象到底是個什么東西呢?

? 在Android api當(dāng)中是這樣描述context對象的蛤织。

"Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc."

“是一個用于實現(xiàn)關(guān)于應(yīng)用環(huán)境的整體信息的一個接口拥娄。這是一個由安卓系統(tǒng)提供的抽象類并且系統(tǒng)有對他進(jìn)行實現(xiàn)。它允許訪問到應(yīng)用特殊的資源和類瞳筏,同時它也可以實現(xiàn)到應(yīng)用級別的操作稚瘾,例如:Activity的啟動,廣播的實現(xiàn)和接受intent等姚炕√罚”

一丢烘、Context的主要實現(xiàn)和繼續(xù)理解

? 知道了context的大概描述,我們可以再繼續(xù)理解Context這個神秘的對象了些椒,首先播瞳,作為基類,肯定有其它類去實現(xiàn)它免糕,主要實現(xiàn)了context類的類是Activity赢乓,Service,Application石窑。他們?nèi)齻€類雖然都是Context的子類牌芋,但是具體的繼承關(guān)系卻有些不大一樣:

Activity的繼承關(guān)系:

Service和Application的繼承關(guān)系:

? 可以看出我們的Context其實就是我們熟知的Activity,Service松逊,Application躺屁。

? 在這3個類中,Activity的context對象和Application的context對象最容易弄混淆经宏。

二犀暑、Context中的主要方法

? 知道了Context的大概描述和他的一些繼承關(guān)系,我們對Context這個類有了一個大致的了解∷咐迹現(xiàn)在可以看看在context中的一些方法耐亏,來加深對context的一個理解,有很多我們使用過的方法其實都是從Context這個類中實現(xiàn)而來沪斟。

? 我們從Android api中查看Context類广辰,這里出現(xiàn)了一個非常熟悉的方法:startActivity,可以看到其實Activity中的StartActivity方法是重寫了Context中的方法币喧。

abstract voidstartActivity(Intentintent)

Same asstartActivity(Intent, Bundle)with no options specified.

abstract voidstartActivity(Intentintent,Bundleoptions)

Launch a new activity.

同時context還可以訪問到資源文件轨域,獲得資源文件中的信息袱耽。

abstractResourcesgetResources()

Return a Resources instance for your application's package.

abstractSharedPreferencesgetSharedPreferences(Stringname, int mode)

Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values.

finalStringgetString(int resId)

Return a localized string from the application's package's default string table.

finalStringgetString(int resId,Object...formatArgs)

Return a localized formatted string from the application's package's default string table, substituting the format arguments as defined inFormatterandformat(String, Object...).

同時context不但可以開啟一個activity杀餐,同時還可以開啟或者關(guān)閉一個Service。

abstractComponentNamestartService(Intentservice)

Request that a given application service be started.

abstract booleanstopService(Intentservice)

Request that a given application service be stopped.

? 訪問Android Api 或者查看源碼可以看到朱巨,Context中還有很多訪問資源文件和程序之間互相通信的方法史翘。

? 可以看出context其實就是一個應(yīng)用之中的手腳,可以通過他來拿取資源文件中的資源冀续,還可以通過他來處理Activity和Service中的一些操作琼讽,這個類就是整個程序的樞紐,負(fù)責(zé)管理整個程序的通暢運行洪唐。

? 我們可以通過分析一個Toast通知的源碼去分析context的去向和使用钻蹬,來了解context到底做了些神馬操作:

public static Toast makeText(Context context, CharSequence text, int duration) {

? ?Toast result = new Toast(context);

? ?LayoutInflater inflate = (LayoutInflater)

? ?context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

? ?View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);

? ?TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);

? ?tv.setText(text);

? ?result.mNextView = v;

? ?result.mDuration = duration;

? ?return result;

}

可以看到makeText方法接受的context被用于

context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);

? 這是用于獲取XML中定義的View的方法,可以看到通過外部傳入的Context凭需,在這里獲得了一個View布局用于顯示Toast问欠。

public Toast(Context context) {

? ?mContext = context;

? ?mTN = new TN();

? ?mTN.mY = context.getResources().getDimensionPixelSize(

? ?com.android.internal.R.dimen.toast_y_offset);

? ?mTN.mGravity = context.getResources().getInteger(

? ?com.android.internal.R.integer.config_toastDefaultGravity);

}

? 這一行中可以看出在context又被用來獲取資源文件肝匆,可以看出Toast的顯示和布局都是通過context去調(diào)用系統(tǒng)寫好的資源文件來進(jìn)行實現(xiàn)的。

三顺献、Activity context和Application context的區(qū)別

? Activity的context和Application的context的區(qū)別在于生命周期的區(qū)別旗国,Activity的context是依附在著Activity的生命周期的,而Application的Context的生命周期是依附在整個應(yīng)用之上的注整。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末能曾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肿轨,更是在濱河造成了極大的恐慌寿冕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝招,死亡現(xiàn)場離奇詭異蚂斤,居然都是意外死亡,警方通過查閱死者的電腦和手機槐沼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門曙蒸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岗钩,你說我怎么就攤上這事纽窟。” “怎么了兼吓?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵臂港,是天一觀的道長。 經(jīng)常有香客問我视搏,道長审孽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任浑娜,我火速辦了婚禮佑力,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筋遭。我一直安慰自己打颤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布漓滔。 她就那樣靜靜地躺著编饺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪响驴。 梳的紋絲不亂的頭發(fā)上透且,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音豁鲤,去河邊找鬼秽誊。 笑死罕邀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的养距。 我是一名探鬼主播诉探,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棍厌!你這毒婦竟也來了肾胯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤耘纱,失蹤者是張志新(化名)和其女友劉穎敬肚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體束析,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡艳馒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了员寇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄慰。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝶锋,靈堂內(nèi)的尸體忽然破棺而出陆爽,到底是詐尸還是另有隱情,我是刑警寧澤扳缕,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布慌闭,位于F島的核電站,受9級特大地震影響躯舔,放射性物質(zhì)發(fā)生泄漏驴剔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一粥庄、第九天 我趴在偏房一處隱蔽的房頂上張望丧失。 院中可真熱鬧,春花似錦飒赃、人聲如沸利花。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臀栈,卻和暖如春蔫慧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背权薯。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工姑躲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留睡扬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓黍析,卻偏偏與公主長得像卖怜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阐枣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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