如何优雅的使用Context
2018-11-08 本文已影响557人
itfitness
目录
目录前言
Context在Android中代表上下文对象,正确的理解Context的作用是很重要的,对于不同的Context要区别对待,否则很可能引入问题。
Context的种类
根据Context依托的组件以及用途不同可以将Context分为以下几种。
- Application:Android中默认的单例类,在Activity和Service中可以通过getApplication()获取到该单例,并可以通过context.getApplicationContext()获取到唯一的全局Context实例。
- Activity/Service:这两个都是ContextWrapper的子类,在这两个类中可以通过getBaseContext()获取到它们的Context实例,不同的Activity或者Service的Context实例是不同的。
- BroadcastReceiver:与Activity和Service不同的是BroadcastReceiver本身不是Context的子类,而是在onReceive回调方法中由Android系统传入一个Context实例,但是这个传入的Context实例是经过裁剪的它不能调用registerReceiver()以及bindService()两个函数。
- ContentProvider:ContentProvider也不是Context的子类,在创建的时候由系统传入一个Context实例,可以通过getContext()获取到该实例,ContentProvider通过getContex()获取到的实例是ContentProvider所在应用唯一的全局Context实例。
错误使用Context导致内存泄漏
错误的使用Context可能会导致内存泄漏,典型的例子就是单例模式时引用不合适的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的实例,那么由于在应用退出之前创建的单例对象会一直存在并持有Activity或者Service的引用,回使Activity或者Service无法被垃圾回收从而导致内存泄漏。正确的做法是使用Application 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.getApplicationContext());//使用Application Context
}
return sSingleInstance;
}
}