Android之Context与ApplicationContext的那些事儿

来源:互联网 发布:矩阵的特征向量怎么求 编辑:程序博客网 时间:2024/05/13 02:49

1.context是什么?
Context是维持Android程序中各组件能够正常工作的一个核心功能类。

Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们各自的上下文环境,也就是context。

这里写图片描述

Activity、Service、Application都属于context,分别对应着三种类型context,这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。

我们很疑惑,什么时候使用context,什么时候使用ApplicationContext,有些时候,传哪个都可以,有些时候传了applicationcontext会报错,必须传context。

由于Context的具体能力是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

2.如何获取?
getApplication()方法,和getApplicationContext()方法,返回的是同一个对象;他们的区别仅仅是 在作用域上。
getApplication()方法的语义性非常强,一看就知道是用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。
如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法。
getApplicationContext()方法的作用域会更广一些,任何一个Context的实例,只要调用getApplicationContext()方法都可以拿到我们的Application对象。

public void onReceive(Context context, Intent intent) {          MyApplication myApp = (MyApplication) context.getApplicationContext();   }  

getBaseContext()方法得到的是一个ContextImpl对象。

3.注意事项
使用context的时候,小心内存泄露,防止内存泄露。
1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
2. 对于生命周期长的对象,可以使用application context
3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化

0 0
原创粉丝点击