Android Application中的Context和Activity中的Context的區別

原文:https://www.cnblogs.com/ganchuanpu/p/6445251.html

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

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

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

1
2
3
public abstract class Context {
      ......
}

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

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

通過繼承關係可以看到,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。

三、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摧毀的時候,它就摧毀。

四、Application中的Context和Activity中的Context各自的使用場景 
Activity Context 和Application Context兩者的使用範圍存在着差異,具體如下圖所示:

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

五、Context數量 
在創建Activity、Service、Application時都會自動創建Context,它們各自維護着自己的上下文。在Android系統中Context類的繼承結構裏面我們講到Context一共有Application、Activity和Service三種類型,因此如果要統計一個app中Context數量,我們可以這樣來表示:

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章