很多地方我们需要使用到Context,比如我们自定义一个单例的CustomManager,当我们使用一些系统的服务时,就需要Context参数,这时如果使用Activity或者Service 作为context,就会容易造成内存泄露。
具体原因请看下面的这个例子:
pubic class CustomManager {
private static CustomManager sInstance;
public static CustomManager getInstance(Context context) {
if (sInstance == null) {
// 这个类拥有了一个静态的context引用
sInstance = new CustomManager(context);
}
return sInstance;
}
private Context mContext;
private CustomManager(Context context) {
mContext = context;
}
}
当所持有的Context的引用是一个Activity或者Service,系统销毁它们后,由于CustomManager中有其静态的引用,所以Activity或者Service所占用的资源并不会被回收,造成内存泄露。
那么正确的方法是使用Application的context, 因为Application的context是单例的,并且它的生命周期属于整个应用进程。所以上边的代码需要改成:
private static CustomManager sInstance;
public static CustomManager getInstance(Context context) {
if (sInstance == null) {
// 这个类拥有了一个静态的context引用
sInstance = new CustomManager(context.getApplicationContext());
}
return sInstance;
}
private Context mContext;