源碼解析
從圖中我們可以看到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的上下文,否則生命週期過長會導致一些泄漏問題。