【Android】Context的使用
android开发经常需要使用context来启动activity,或者打开sharedpreferences,或者构建一个dialog。最近老是用到getcontext(),getapplicationcontext(),this等,来获取context,故写此文来理清思路。确定好需要context的时候,究竟用哪个函数。
context
什么是context呢?
个人的理解是:context就是上下文,换句话说就是运行的环境。它可以用来新建对象,访问资源。
官方的参考文档,只有一段:
interface to global information about an application environment. this is an abstract class whose implementation is provided by the android system. it allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
这么一段说了3件事情(简单的翻译如下):
- 它是获取应用环境信息的接口。
- 它是一个抽象类,实现由安卓系统提供。
- 它允许访问application-specific的资源和类;执行应用级别的操作,比如开启一个activity。
获取context的方法
获取context的方法有如下几种:
- activity类中使用this关键字
- someactivity.this
- 在fragment中,可以getactivity()
- getcontext()
- getapplicationcontext()
- getbasecontext()
那么这几种获取context对象的方式有什么异同?
首先将这些方法分类,按照使用的地方分类:
在activity中可以使用的:
- activity类中使用this关键字
- someactivity.this
- getapplicationcontext()
- getbasecontext()
在fragment中可以使用的:
- getcontext()
- getactivity()
在view中可以使用的:
- getcontext()
它们各自的含义
在activity类中使用this关键字,等同于someactivity.this。
getapplicationcontext() 获取整个应用的context,获取的对象存活周期和应用一样长。
getcontext() view中获取的是当前活动的activity,fragment中返回与之关联的context
getactivity() 返回当前fragment相关联的activity
getbasecontext() 获取contextwrapper的原始context
不管是application,还是activity,它们都继承了context。
避免context引起的内存泄漏
由context引起的内存泄漏主要由两个原因:
- 引用了这个context的对象存活时间长过传入的activity。
- 成员内部类和匿名内部类隐式持有外部类的对象导致。
第一种情况好理解,当activity销毁的时候,还有对象引用了这个activity,那么gc不会回收这个activity。
第二种情况的原因,参见链接4。讲的主要是内部类会隐式的持有外部类的对象导致gc不回收这个activity。在安卓中可能发生内存泄漏的地方是,一个activity里面有一个runnable的运行还没结束,这个activity已经销毁了。但是这个activity被runnabl隐式地持有,导致activity无法被回收。
既然如此,那就干脆不要用this好了!用getapplicationcontext()不就好了?
但是,getapplicationcontext()有其弊端!
链接3解释了不用getapplicationcontext()的原因:它不是完整的context。可能导致一些gui相关的问题。比如alertdialog.builder不能使用getapplicationcontext(),因为dialog需要一些主题相关的信息,而application并不包含这些信息。(you need to use a theme.appcompat theme (or descendant) with this activity)
那么什么时候用getapplicationcontext(),什么时候用this?
一般而言,如果context不需要ui相关的操作,就用getapplicationcontext()。如果对象存活时间可能比activity长,考虑使用getapplicationcontext()。其他情况,确保activity销毁前,取消引用activity,用this就好了。
参考链接
上一篇: 用pandas按列合并两个文件的实例
下一篇: Linux-day-1