Android之getApplication()、getApplicationContext的區別

lvxiangan發表於2018-10-24

getApplication()

Android系統自動會為每個程式執行時建立一個Application類的物件且只建立一個,所以Application可以說是單例(singleton)模式的一個類。Application和Activity,Service一樣是Android框架的一個系統元件,當Android程式啟動時系統會建立一個Application物件,用來儲存系統的一些資訊。

通過原始碼我們可以發現,Application和Activity都繼承自Context,他們都是環境上下文,只不過Application是隨著我們的應用(或者包)啟動的時候就存在的環境,Activity是一個介面的環境。Application是在應用一建立就初始化了,而且是在應用執行時一直存在的,那我們可以把它當做是一個全域性變數來使用,可以儲存一些共享的資料,或者說做一些工具類的初始化工作。在平時的開發中,有時候可能會需要一些全域性資料,通常要新建一個類來繼承Application,使用getApplication()用於獲取Application的一個物件例項:

public class MyApplication extends Application {}

可以通過重寫onCreate()方法來做一些初始化工作:

 @Override
 public void onCreate() {
      super.onCreate();
       ToastUtils.register(this);
       //LeakCanary檢測OOM
       LeakCanary.install(this);
 }

最後還需要在Manifest.xml檔案中做一下宣告:

<application
    android:name=".MyApplication"
    ...
</application>

在獲取Application時,如果是在Context的情況下可以就可以直接通過(MyApplication)getApplication()來獲取。還有一種做法是在沒有Context的情況下,可以通過仿照單例的做法來實現獲取:

public class MyApplication extends Application {
    private static MyApplication instance;
}
@Override
public void onCreate() {
    super.onCreate();
    instance = this;
}
 // 獲取Application
    public static Context getMyApplication() {
        return instance;
}


getApplicationContext()

getApplicationContext() 是返回應用的上下文,也就是把Application作為Context,生命週期是整個應用,應用摧毀它才摧毀。這裡要區別一下Activity的Context,Activity.this的context 返回當前Activity的上下文,及把Activity用作Context,生命週期屬於Activity ,Activity 摧毀他就摧毀。

在使用上要注意:和UI相關的方法基本都不建議或者不可使用Application,只要把握住一點,凡是跟UI相關的,都應該使用Activity做為Context來處理


原文:https://blog.csdn.net/u014665856/article/details/72354406 

相關文章