目錄
目錄
前言
Context在Android中代表上下文對象,正確的理解Context的作用是很重要的,對于不同的Context要區(qū)別對待,否則很可能引入問題煞额。
Context的種類
根據(jù)Context依托的組件以及用途不同可以將Context分為以下幾種。
- Application:Android中默認(rèn)的單例類沾谜,在Activity和Service中可以通過getApplication()獲取到該單例膊毁,并可以通過context.getApplicationContext()獲取到唯一的全局Context實例。
- Activity/Service:這兩個都是ContextWrapper的子類基跑,在這兩個類中可以通過getBaseContext()獲取到它們的Context實例婚温,不同的Activity或者Service的Context實例是不同的。
- BroadcastReceiver:與Activity和Service不同的是BroadcastReceiver本身不是Context的子類媳否,而是在onReceive回調(diào)方法中由Android系統(tǒng)傳入一個Context實例栅螟,但是這個傳入的Context實例是經(jīng)過裁剪的它不能調(diào)用registerReceiver()以及bindService()兩個函數(shù)荆秦。
- ContentProvider:ContentProvider也不是Context的子類,在創(chuàng)建的時候由系統(tǒng)傳入一個Context實例力图,可以通過getContext()獲取到該實例步绸,ContentProvider通過getContex()獲取到的實例是ContentProvider所在應(yīng)用唯一的全局Context實例。
錯誤使用Context導(dǎo)致內(nèi)存泄漏
錯誤的使用Context可能會導(dǎo)致內(nèi)存泄漏搪哪,典型的例子就是單例模式時引用不合適的Context靡努。
public class SingleInstance {
private static SingleInstance sSingleInstance;
private Context mContext;
public SingleInstance(Context mContext) {
this.mContext = mContext;
}
public static SingleInstance getInstance(Context context){
if(sSingleInstance==null){
sSingleInstance=new SingleInstance(context);
}
return sSingleInstance;
}
}
如果使用getInstance傳入的是Activity或者Service的實例坪圾,那么由于在應(yīng)用退出之前創(chuàng)建的單例對象會一直存在并持有Activity或者Service的引用晓折,回使Activity或者Service無法被垃圾回收從而導(dǎo)致內(nèi)存泄漏。正確的做法是使用Application Context對象兽泄,因為它的生命周期是和應(yīng)用一致的漓概。
public class SingleInstance {
private static SingleInstance sSingleInstance;
private Context mContext;
public SingleInstance(Context mContext) {
this.mContext = mContext;
}
public static SingleInstance getInstance(Context context){
if(sSingleInstance==null){
sSingleInstance=new SingleInstance(context.getApplicationContext());//使用Application Context
}
return sSingleInstance;
}
}