Context细节

Context细节


Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了,Context可以用来启动服务,发送广播,弹出对话框,开启一个活动,获取资源等等。但是Context同时也包含了很多细节,获取Context的方法多种多样?得到不同的Context完全相同吗?Context的正确用法?下面我们就详细总结一下,为什么是总结,因为这个博客很多了大多数都没有写的很全面,我做一个总结…

参考博客
郭大神: http://blog.youkuaiyun.com/guolin_blog/article/details/47028975
低调小一: http://blog.youkuaiyun.com/wzy_1988/article/details/51539503

1.Context的定义,分类

Android和Java不同的地方就是?Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们各自的上下文环境,也就是我们这里讨论的Context。可以这样讲,Context是维持Android程序中各组件能够正常工作的一个核心功能类。
—— 转自郭霖大神博客

Context分类

直系子类有两个,一个是ContextWrapper,一个是ContextImpl。那么从名字上就可以看出,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类,Application,Service,Activity中都是Context类型,但是具体的通用功能ContextImpl实现了,注意这里使用了代理模式

  • Application: Application在应用程序中是单例运行.可以在Activity或者Service中通过getApplication()方法获取,或者在任何继承Context的类中通过getApplicationContext()方法获取.不过无论是通过哪种方法获取Application的实例,Application的实例都是唯一的,相同的.(—注意使用getBaseContext()得到的不是Application,而是真正的工作者ContextImpl对象,因为上面说了Application只是封装类,ContextImpl是功能实现类-)
  • Activity/Service: Activity/Service都继承自ContextWrapper,因为具有相同的Context API.每当Framework创建一个新的Activity或者Service实例的时候,同时会创建一个新的ContextImpl对象,ContextImpl就是最终处理所有Context API方法的内部对象.不同的Activity或者Service的Context都是不一样的

https://i.imgur.com/W5uEQQf.png
我们发现和界面相关的操作只有Activity可以启动,其他Context的功能基本相同

2.Context的数量

Context数量 = Activity数量 + Service数量 + 1(Application)

3.使用Context工具类

3.1在Application中使用

public class MyApplication  extends Application{
    private static MyApplication instance;
    public static MyApplication getInstance(){
        return instance;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this; //放到onCreate()进行赋值,绝对不可以在构造函数中,在构造函数中赋值时attachBaseContext()还没有执行,会产生null指针异常
    }
}

3.2创建单件模式工具类

public class CustomManager {
    private static CustomManager sInstance;

    public static CustomManager getInstance(Context context) {
        if (sInstance == null) {
            // Always pass in the Application Context
            sInstance = new CustomManager(context.getApplicationContext()); //这里通过参数获取全局的Application而不是直接引用参数context,是因为这里的sInstance是静态变量,当静态变量引用非静态变量会产生内存溢出
        }
        return sInstance;
    }

    private Context mContext;
    private CustomManager(Context context) {
        mContext = context;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值