安卓中getApplicationContext(),getApplication(),this的區別

源碼解析

這裏寫圖片描述
從圖中我們可以看到Context和它的家族們。
Context作爲基類。一般來說都是抽象的。一個ContextWrapper。一個ContextImpl分別是它的子類。
我們來看一下getApplicationContext()源碼。

    @Override
    public Context getApplicationContext() {
        return mBase.getApplicationContext();
    }

首先調用getApplicationContext方法就調用了ContextWrapper的getApplicationContext方法。而mBase是什麼呢?

public class ContextWrapper extends Context {
    Context mBase;
    ...
    }

原來是父類。但是不對啊父類是抽象的。哪實現的?其實在ContextImp中實現。

    @Override
    public Context getApplicationContext() {
        return (mPackageInfo != null) ?
                mPackageInfo.getApplication() : mMainThread.getApplication();
    }

mPackageInfo 是對apk的管理。我再看看。

mPackageInfo.getApplication()

    Application getApplication() {
        return mApplication;
    }

mApplication是Application的引用。
mMainThread.getApplication();

    public Application getApplication() {
        return mInitialApplication;
    }

mInitialApplication也是Application的引用。

getApplicationContext和getApplication區別?

那麼也就是說getApplicationContext返回的是Application對象。
而getApplication返回的也是Application對象。
也就是這兩個方法都可以獲取全局application對象。生命週期長,只要應用存活它就存在。

其實,從圖中可以看到,BroadCastReceiver和Service是不繼承Context的。也就是說,我們在這兩個組件中用到Context是getApplicationContext。getApplication只在Activity和Service中用到。

而getApplication能獲取到在xml標籤中的application。我們從來不會調用getApplicationContext來獲取。
有時候可能會需要一些全局數據,來讓應用中得所有Activity和View都能訪問到
,會自定義一個application�%25BD%25A5繼承Application。我們可以在Activity中使用getApplication(),方法來獲得,它是代表我們的應用程序的類,使用它可以獲得當前應用的主題,資源文件中的內容等。

Activity中的this?

Activity實際上是應用程序context上下文的一個子集。
Activity中的this指代的是activity對象。在匿名內部類中通常使用。activity類名.this來指代本體。也就是隨着activity的生命週期存在而存在。

getBaseContext()?

public class ContextWrapper extends Context {
    Context mBase;
    ...
      public Context getBaseContext() {
        return mBase;
      }
    ...
    }

從代碼中我們可以看到getBaseContext拿到的也是Context。
從我所知道的來看,儘量要自己的Context,通過getBaseContext拿到這個context,可能是再android sdk開發中會用到吧。

總結

從這幾方面我們來看。能用activity的就用activity的上下文,否則生命週期過長會導致一些泄漏問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章