1. 程式人生 > >Android中的Context類解析

Android中的Context類解析


一、Context類官方說明:

  1. 是應用程式全域性資訊資料有關的方法類
  2. 是一個抽象類,由android 系統提供該類的具體實現類ContextImppl類
  3. 通過context可以獲取應用程式的resources和classes等

二、Context類的主要用途:

  1. 載入資源(file,res中的檔案等)獲取包名等(context.getResource())
  2. 啟動activity或傳送廣播等(context.startActivity(intent))
  3. 構造檢視(new View(context))
  4. 獲取系統服務(context.getSystemService())

三、context類的繼承結構:


這裡寫圖片描述
tips:
1.ContextImpl為系統提供的Context的實現類
2.ContextWrapper為context的封裝類,裡面有一個mBase屬性變數是ContextImpl類的例項,通過attachBaseContext(Context base)來將ContextImpl例項傳入,attachBaseContext(Contextbase)方法是由系統呼叫的,通過contextWrapper.getBaseContext()可以獲得,ContextWrapper中所有的Context方法都是通過呼叫mBase的同名方法來實現的
3.Application,Service,Activity都是Context的子類,因此一個應用中context的數量 =Activity的數量+Service的數量+1;
四、Application、Service、Activity的具體分析

activity,Service,Application都是Context的子類,他們的context功能都是有ContextImpl去實現的,因此絕大多數情況下這三種類型的context都是可以通用的,特殊情況下出於安全考慮,startActivity時必須是在一個Activity類的context上開啟另一個Activity形成返回棧,彈出Dialog也必須在Activity型別的Context
Application、Service、Activity例項化ContextWrapper中的mBase(ContextImpl例項)是在構造方法之後,onCreate方法之前被系統呼叫的,所以有關context方法的呼叫必須要在attachBaseContext之後才能呼叫

這裡寫圖片描述

1、Application:單例模式的application全域性狀態類,每一個應用程式都有一個Application類,當應用的程序被建立時, Application會在所有class例項化之前最先例項化,可以通過繼承來自定義MyApplication, 封裝一些通用的操作:

//Application已經是單例模式了,子類無需在封裝單例保護
public class MyApplication extends Application {
    private static MyApplication app;

    public static MyApplication getInstance(){
        return app;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        app = this;
    }

    //定義自己的通用方法

}

//在manifest中 使用自定義的MyApplication類
<application
        android:name=".MyApplication"//自定義的MyApplication類的全稱
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">