欢迎大家来到IT世界,在知识的湖畔探索吧!
定义
Android开发中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.
翻译后:一个应用程序环境全局信息的接口。Context是一个抽象类并且Android系统提供了实现。通过它允许访问应用程序特定的资源和类,和各种程序级别操作如启动Activity,broadcasting,接受intent等的返回值一样。
这段话说了等于白说,初学者肯定是一脸懵逼。。。
那我们先来看Context类的继承关系:
这个图中我们可以得到一些信息:
-
Context:是一个抽象类,它有很多抽象方法:getAssets(),getResources(),getPackageManager()等。
-
ContextImpl:实现了Context的各种抽象方法,包括getAssets(),getResources(),getPackageManager()等。我们在代码中使用上面的方法,其实是ContextImpl中实现的。
-
ContextWrapper:是Context的一个封装,ContextWrapper内部的方法都是调用Context对象的方法,Service,Application直接继承
-
ContextThemmWrapper:看名字就知道跟Theme(UI)有关,因为Activity不同Service和Application,是有界面的。所以直接继承于它。
总结一下就是:
Context是一个抽象类,ContextWrapper是对Context的封装,它包含一个Context类型的变量,ContextWrapper的功能函数内部其实都是调用里面的Context类型变量完成的。 Application,Service,Activity等都是直接或者间接继承自ContextWrapper,但是并没有真正的实现其中的功 能,Application,Service,Activity中关于Context的功能都是通过其内部的Context类型变量完成的,而这个变量的 真实对象必定是ContextImpl,所以没创建一个Application,Activity,Servcice便会创建一个 ContextImpl,并且这些ContextImpl中的mPackages和mResources变量都是一样的,所以不管使用Acitivty还是Service调用getResources得到相同的结果。
getBaseContext(), getApplicationContext(), this三者的关系
this
从上面的解析来看,每一个Activity就是一个Context,每一个Service就是一个Context,这也就是为什么使用Context的地方可以被Activity或者Service替换了,经常在一个Activity中看到这样的代码:Context mContext = this;又或者在Activity中直接使用getResources(),getPackageManager()等,实质上是调用Context的方法。
getBaseContext()
实际上返回的是ContextImpl对象,看源码:
public ContextWrapper(Context base) {
mBase = base;
}
public Context getBaseContext() {
return mBase;
}
getApplicationContext()
getApplicationContext()返回的是整个Android程序生命周期唯一的一个Context,所以我们需要用到Context方法的时候尽量用getApplicationContext()而不是this,这样会避免Activity的内存泄露。
需要注意的是如果你用AlertDialog.Builder()的时候,这里的Context一定是Activity对象,因为对话框是依附于某个Activity的,不可能是getApplicationContext()。
一个应用程序中一共能有多少个context?
答案显而易见:总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)
下一篇会从源码角度去理解Context。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/22278.html