022android初級篇之android的Context

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

從上可知一下三點,即:

  1. 它提供了application 環境全局信息接口;
  2. 該類是一個抽象類(abstract class),Android提供了該抽象類的具體實現類;
  3. 通過該類我們可以訪問應用程序的資源和類,也包括進行應用級別的操作,例如啟動一個Activity,發生Broadcast,接收Intent信息等。

相關的類

022_01.png

Context類

路徑: /frameworks/base/core/java/android/content/Context.java
說明: 抽象類,提供了一組通用的API。

public static final int MODE_PRIVATE = 0x0000;
public static final int MODE_APPEND = 0x8000;

public static final int MODE_MULTI_PROCESS = 0x0004;

 /** Return an AssetManager instance for your application's package. */
public abstract AssetManager getAssets();

/** Return a Resources instance for your application's package. */
public abstract Resources getResources();

/** Return PackageManager instance to find global package information. */
public abstract PackageManager getPackageManager();

/** Return a ContentResolver instance for your application's package. */
public abstract ContentResolver getContentResolver();
public abstract Looper getMainLooper();
 public abstract Context getApplicationContext();

ContextIml.java類

路徑 :/frameworks/base/core/java/android/app/ContextImpl.java

說明:該Context類的實現類為ContextIml,該類實現了Context類的功能。該函數的大部分功能都是直接調用其屬性mPackageInfo去完成。

ContextWrapper類

路徑 :\frameworks\base\core\java\android\content\ContextWrapper.java

說明: 正如其名稱一樣,該類只是對Context類的一種包裝,該類的構造函數包含了一個真正的Context引用,即ContextIml對象。

ContextThemeWrapper類

路徑:/frameworks/base/core/java/android/view/ContextThemeWrapper.java

說明:該類內部包含了主題(Theme)相關的接口,即android:theme屬性指定的。只有Activity需要主題,Service不需要主題,所以Service直接繼承于ContextWrapper類。

Activity類 、Service類 、Application類都是Context的子類

創建Context實例

因此應用程序App共有的Context數目公式為:

總Context實例個數 = Service個數 + Activity個數 + 1(Application對應的Context實例)

1、創建Application對象的時機

每個應用程序在第一次啟動時,都會首先創建Application對象。如果對應用程序啟動一個Activity(startActivity)流程比較
清楚的話,創建Application的時機在創建handleBindApplication()方法中,該函數位于 ActivityThread.java類中

2、創建Activity對象的時機

通過startActivity()或startActivityForResult()請求啟動一個Activity時,如果系統檢測需要新建一個Activity對象時,就會
回調handleLaunchActivity()方法,該方法繼而調用performLaunchActivity()方法,去創建一個Activity實例,并且回調
onCreate(),onStart()方法等, 函數都位于 ActivityThread.java類

3、創建Service對象的時機

通過startService或者bindService時,如果系統檢測到需要新創建一個Service實例,就會回調handleCreateService()方法,
完成相關數據操作。handleCreateService()函數位于 ActivityThread.java類

參考鏈接

  1. Android中Context詳解 ---- 你所不知道的Context
  2. Android源碼分析-全面理解Context
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容