深入理解Android中Context(一)

深入理解Android中Context(一)Android开发中Context是一个比较基础,又比较重要的概念。翻译后:一个应用程序环境全局信息的接口。

欢迎大家来到IT世界,在知识的湖畔探索吧!

深入理解Android中Context(一)

定义

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类的继承关系:

深入理解Android中Context(一)

Context子类关系图

这个图中我们可以得到一些信息:

  1. Context:是一个抽象类,它有很多抽象方法:getAssets(),getResources(),getPackageManager()等。

  2. ContextImpl:实现了Context的各种抽象方法,包括getAssets(),getResources(),getPackageManager()等。我们在代码中使用上面的方法,其实是ContextImpl中实现的。

  3. ContextWrapper:是Context的一个封装,ContextWrapper内部的方法都是调用Context对象的方法,Service,Application直接继承

  4. 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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信