Android中的Context----既熟悉又陌生的朋友

在Android開發中,我們似乎無時不刻都在和一個很奇怪的東西Context打交道。但是我們很多時候又不得不承認,它是一個“既熟悉又陌生”的朋友。

getApplicationContext()

Adapter類中的Context:

public MyAdapter(int count, Context context) {
		this.mCount = count;
		this.context = context;	
}

上面這些代碼想必都不陌生吧。那Context到底是什麼東西呢,出於好奇的心理,Ctrl+鼠標單擊 點開”Context“查看SDK中對於它的說明:

/**
 * 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.
 */

大致就是說Context是一個抽象類,由Android系統提供,描述了一個應用環境的全局信息,可以利用它來獲取應用資源和類,也可以啓動一個Activity、廣播、接受Intent等等。看了SDK中對於Context的說明還是頗感疑惑。

幾經查詢資料,發現《Android內核剖析》這本書中對於Context的解釋非常的生動也利於理解(我可不是在打廣告哦,我和該書作者並不熟哈)。這本書中沒有把Context翻譯成我們平常所看到的”上下文“,而是把它翻譯成了”場景“。先從語義的角度審視了Context,場景應該是用戶和操作系統之間的一次交互。比如說用戶使用一款mp3播放軟件,用戶可以利用他播放暫停音樂、查看歌詞,這些都是有界面的。當用戶回到桌面進行其他操作,同樣可以聽到mp3.一個看得到的界面,一個看不到界面的交互都可稱作是一個場景,並且這兩種場景都是圍繞這一個應用程序展開的。從語義上我們就對於Context有了更生動的理解。當我們回到代碼來真正理解Context,從Activity追本溯源我們會發現Activity的繼承鏈是這樣的Activity-> ContextThemeWrapper -> ContextWrapper-> Context. 這時你會驚奇的發現。天啊!Activity竟然是由Context派生而來。也就是說Activity本質上竟然是一個Context,但這也就不正印證了我們前面對於Context語義上的分析了嗎?我們看的到的一個MP3播放器的界面是一個場景,這個界面就是一個Activity;同理,看不到的界面,播放音樂的Service也是一個Context。

Activity, Service和Context之間的繼承關係如下:


圖1 Context類與Activity, Service之間的繼承關係圖

到這裏相信你已經對Context有了一個大致的瞭解,但這裏還需要注意的一點是,除了Activity和Service,應用程序每次啓動的時候都是創建一個Application對象,這個Application對象本身也是一個Context。所以一個應用程序包含的Context的數量應該遵循下面的公式:

Context個數 =Service個數 +Activity個數+1


發佈了22 篇原創文章 · 獲贊 44 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章