0
点赞
收藏
分享

微信扫一扫

如何优雅的使用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;
    }
}

个人技术部博客:https://myml666.github.io/

举报

相关推荐

0 条评论