Android Context完全解析,你所不知道的Context的各種細節

CSDN學院發表於2016-10-28

前幾篇文章,我也是費勁心思寫了一個ListView系列的三部曲,雖然在內容上可以說是絕對的精華,但是很多朋友都表示看不懂。好吧,這個系列不僅是把大家給難倒了,也確實是把我給難倒了,之前為了寫瀑布流ListView的Demo就寫了大半個月的時間。那麼本篇文章我們就講點輕鬆的東西,不去分析那麼複雜的原始碼了,而是來談一談大家都熟知的Context。
Context相信所有的Android開發人員基本上每天都在接觸,因為它太常見了。但是這並不代表Context沒有什麼東西好講的,實際上Context有太多小的細節並不被大家所關注,那麼今天我們就來學習一下那些你所不知道的細節。
Context型別
我們知道,Android應用都是使用Java語言來編寫的,那麼大家可以思考一下,一個Android程式和一個Java程式,他們最大的區別在哪裡?劃分界限又是什麼呢?其實簡單點分析,Android程式不像Java程式一樣,隨便建立一個類,寫個main()方法就能跑了,而是要有一個完整的Android工程環境,在這個環境下,我們有像Activity、Service、BroadcastReceiver等系統元件,而這些元件並不是像一個普通的Java物件new一下就能建立例項的了,而是要有它們各自的上下文環境,也就是我們這裡討論的Context。可以這樣講,Context是維持Android程式中各元件能夠正常工作的一個核心功能類。
下面我們來看一下Context的繼承結構:

Context的繼承結構還是稍微有點複雜的,可以看到,直系子類有兩個,一個是ContextWrapper,一個是ContextImpl。那麼從名字上就可以看出,ContextWrapper是上下文功能的封裝類,而ContextImpl則是上下文功能的實現類。而ContextWrapper又有三個直接的子類,ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一個帶主題的封裝類,而它有一個直接子類就是Activity。
那麼在這裡我們至少看到了幾個所比較熟悉的面孔,Activity、Service、還有Application。由此,其實我們就已經可以得出結論了,Context一共有三種型別,分別是Application、Activity和Service。這三個類雖然分別各種承擔著不同的作用,但它們都屬於Context的一種,而它們具體Context的功能則是由ContextImpl類去實現的。
那麼Context到底可以實現哪些功能呢?這個就實在是太多了,彈出Toast、啟動Activity、啟動Service、傳送廣播、運算元據庫等等等等都需要用到Context。由於Context的具體能力是由ContextImpl類去實現的,因此在絕大多數場景下,Activity、Service和Application這三種型別的Context都是可以通用的。不過有幾種場景比較特殊,比如啟動Activity,還有彈出Dialog。出於安全原因的考慮,Android是不允許Activity或Dialog憑空出現的,一個Activity的啟動必須要建立在另一個Activity的基礎之上,也就是以此形成的返回棧。而Dialog則必須在一個Activity上面彈出(除非是System Alert型別的Dialog),因此在這種場景下,我們只能使用Activity型別的Context,否則將會出錯。
Context數量
那麼一個應用程式中到底有多少個Context呢?其實根據上面的Context型別我們就已經可以得出答案了。Context一共有Application、Activity和Service三種型別,因此一個應用程式中Context數量的計算公式就可以這樣寫:
[plain] view plain copy
Context數量 = Activity數量 + Service數量 + 1
上面的1代表著Application的數量,因為一個應用程式中可以有多個Activity和多個Service,但是隻能有一個Application。
Application Context的設計
基本上每一個應用程式都會有一個自己的Application,並讓它繼承自系統的Application類,然後在自己的Application類中去封裝一些通用的操作。其實這並不是Google所推薦的一種做法,因為這樣我們只是把Application當成了一個通用工具類來使用的,而實際上使用一個簡單的單例類也可以實現同樣的功能。但是根據我的觀察,有太多的專案都是這樣使用Application的。當然這種做法也並沒有什麼副作用,只是說明還是有不少人對於Application理解的還有些欠缺。那麼這裡我們先來對Application的設計進行分析,講一些大家所不知道的細節,然後再看一下平時使用Application的問題。
首先新建一個MyApplication並讓它繼承自Application,然後在AndroidManifest.xml檔案中對MyApplication進行指定,如下所示:
[html] view plain copy

相關文章