Android Application中的Context和Activity中的Context的異同

1、Context是什麼:
一、Context是維持Android程序中各組件可以正常工做的一個核心功能類,咱們選中Context類 ,按下快捷鍵F4,右邊就會出現一個Context類的繼承結構圖啦,以下圖所示: 

看下我用紅線標出來的地方,從這裏能夠看到Activity、Service、Application都是Context的子類;html

二、再來從源碼角度看Context類:android

public abstract class Context {
      ......
}

從源碼中咱們能夠看見Context是個抽象類,裏面定義了各類抽象方法,包括獲取系統資源,獲取系統服務,發送廣播,啓動Activity,Service等,結合上圖也就是說Activity、Service、Application等都是Context類的一個實現。再仔細看一下上圖:Activity、Service、Application都是繼承自ContextWrapper(上下文功能的封裝類),而在ContextWrapper的源碼中咱們能夠看到,ContextWrapper內部會包含一個base context(這裏就不貼出來了,你們去看源碼便可),由這個base context去實現了絕大多數的方法。app

2、下面咱們來看一下在Android系統中Context類的繼承結構:
這裏寫圖片描述this

經過繼承關係能夠看到,Context直接子類爲ContextIml(具體實現類)和ContextWrapper(上下文功能包裝類),而ContextWrapper又有三個子類,分別是ContextThemeWrapper、Service和Application。基於Activity和Service、Application不在一個繼承層級裏,而是又繼承了ContextThemeWrapper。細心的朋友看到ContextWrapper和ContextThemeWrapper這兩個類的名字,相信你內心已經有了答案,對的,區別在Theme。ContextThemeWrapper是一個帶主題的封裝類,內部包含了主題(Theme)相關的接口,當Activity在啓動的時候系統都會加載一個主題,也就是咱們在配置文件AndroidManifest.xml裏面寫的android:theme=」@style/AppTheme」的屬性啦!(以下圖所示),但是Service和Applicaton並不須要加載主題,所以他們繼承自ContextWrapper。 spa

3、Application中的Context和Activity中的Context的區別
在須要傳遞Context參數的時候,若是是在Activity中,咱們能夠傳遞this(這裏的this指的是Activity.this,是當前Activity的上下文)或者Activity.this。這個時候若是咱們傳入getApplicationContext(),咱們會發現這樣也是能夠用的。但是你們有沒有想過傳入Activity.this和傳入getApplicationContext()的區別呢?首先Activity.this和getApplicationContext()返回的不是同一個對象,一個是當前Activity的實例,一個是項目的Application的實例,這二者的生命週期是不一樣的,它們各自的使用場景不一樣,this.getApplicationContext()取的是這個應用程序的Context,它的生命週期伴隨應用程序的存在而存在;而Activity.this取的是當前Activity的Context,它的生命週期則只能存活於當前Activity,這二者的生命週期是不一樣的。getApplicationContext() 生命週期是整個應用,當應用程序摧毀的時候,它纔會摧毀;Activity.this的context是屬於當前Activity的,當前Activity摧毀的時候,它就摧毀。xml

4、Application中的Context和Activity中的Context各自的使用場景
Activity Context 和Application Context二者的使用範圍存在着差別,具體以下圖所示: htm

咱們就只看Activity和Application,能夠看到前三個操做不在Application中出現,也就是Show a Dialog、Start an Activity和Layout Inflation。開發的過程當中,咱們主要記住一點,凡是跟UI相關的,都用Activity作爲Context來處理。對象

5、Context數量
在建立Activity、Service、Application時都會自動建立Context,它們各自維護着本身的上下文。在Android系統中Context類的繼承結構裏面咱們講到Context一共有Application、Activity和Service三種類型,所以若是要統計一個app中Context數量,咱們能夠這樣來表示:blog

Context數量 = Activity數量 + Service數量 + 1

這裏要解釋一下,上面的1表示Application數量。一個應用程序中能夠有多個Activity和多個Service,但只有一個Application。可能有人會說一個應用程序裏面能夠有多個Application啊,個人理解是:一個應用程序裏面能夠有多個Application,但是在配置文件AndroidManifest.xml中只能註冊一個,只有註冊的這個Application纔是真正的Application,纔會調用到所有的生命週期,因此Application的數量是1。繼承

相關文章
相關標籤/搜索