Android开发常常须要使用Context来启动Activity,或者打开SharedPreferences,或者构建一个Dialog。最近总是用到getContext(),getApplicationContext(),this等,来获取Context,故写此文来理清思路。肯定好须要Context的时候,究竟用哪一个函数。app
什么是Context呢?ide
我的的理解是:Context就是上下文,换句话说就是运行的环境。它能够用来新建对象,访问资源。函数
官方的参考文档,只有一段:post
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.ui
这么一段说了3件事情(简单的翻译以下):this
获取Context的方法有以下几种:.net
那么这几种获取Context对象的方式有什么异同?翻译
首先将这些方法分类,按照使用的地方分类:orm
在Activity中能够使用的:对象
在Fragment中能够使用的:
在View中能够使用的:
在Activity类中使用this关键字,等同于SomeActivity.this。
getApplicationContext() 获取整个应用的Context,获取的对象存活周期和应用同样长。
getContext() View中获取的是当前活动的Activity,Fragment中返回与之关联的Context
getActivity() 返回当前Fragment相关联的Activity
getBaseContext() 获取ContextWrapper的原始context
无论是Application,仍是Activity,它们都继承了Context。
由Context引发的内存泄漏主要由两个缘由:
第一种状况好理解,当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就行了。