Android 內核 - 02 Context

理解 Context


上下文,環境,場景,一個動態的過程,用戶和Android系統交互的一次過程。Context貫穿整個App,理解它的源碼,可以比較好的理解一個App的執行過程。

一個Activity或一個Service本質上就是一次與用戶交互的,一個Activity或一Service就對應着一個Context。
Context 個數 = Service個數 + Activity 個數 + 1 (Application的Context)



Context 在 Android中的源碼


Context.java  /frameworks/base/core/java/android/content/中,它本身的定義是一個抽象類
public abstract class Context {
......
}
其實現是在 ContextImpl.java 中   /frameworks/base/core/java/android/app/

源碼中關於Context的類的關係

pic0
Application 和 Context

在Application中 Context(ContextImpl)的創建

相關文件
AccountManagerService.java (frameworks\base\services\java\com\android\server\accounts) 
ActivityThread.java (frameworks\base\core\java\android\app)

創建流程

p_01

Service 和 Context

在Service中 Context(ContextImpl)的創建

相關文件
ActiveServices.java (frameworks\base\services\java\com\android\server\am) 
ActivityThread.java (frameworks\base\core\java\android\app)

創建流程

p_02

Activity和 Context

在Activity中 Context(ContextImpl)的創建

相關文件
ActivityStackSupervisor.java (frameworks\base\services\java\com\android\server\am)
ActivityThread.java (frameworks\base\core\java\android\app)

創建流程
p_03


ContextImpl 的內容

從ContextImpl的成員變量來看,它更像是是一個容器,保存了與它相關的局部或全局的一些信息。這些信息可以全面描述用戶正在操作的場景。

    /*package*/ LoadedApk mPackageInfo;
    private String mBasePackageName;
    private String mOpPackageName;
    private Resources mResources;
    /*package*/ ActivityThread mMainThread;
    private Context mOuterContext;
    private IBinder mActivityToken = null;
    private ApplicationContentResolver mContentResolver;
    private int mThemeResource = 0;
    private Resources.Theme mTheme = null;
    private PackageManager mPackageManager;
    private Display mDisplay; // may be null if default display
    private Context mReceiverRestrictedContext = null;
    private boolean mRestricted;
    private UserHandle mUser;
    private ResourcesManager mResourcesManager;





發佈了235 篇原創文章 · 獲贊 31 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章