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
從上可知一下三點,即:
- 它提供了application 環境全局信息接口;
- 該類是一個抽象類(abstract class),Android提供了該抽象類的具體實現類;
- 通過該類我們可以訪問應用程序的資源和類,也包括進行應用級別的操作,例如啟動一個Activity,發生Broadcast,接收Intent信息等。
相關的類
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類