今天的面试题。也就是我们常见面试题系列的第二题,我们来讲一讲android中的context。我相信大家android开发人员一定对于这个context很熟悉,肯定都有使用过,肯定没有没使用过的。可是这个context是什么呢?有多少人能理解呢?我们上一个题讲的是listview,这个也是很常见的。今天的context也是很常见的。所以面试题事实上离我们很近的,一定都是经常使用的才会问题,很少有公司面试一些很偏僻的,不用的东西,在开发中没用面试什么啊?对吧,好了,有点扯多了,我们从茄子地里回来,接着讲这个context。
1、什么是context?
这个在我们开发中最熟悉而又陌生的朋友究竟是什么呢?可能大家会不约而同的说。是场景,是上下文,可是究竟有多少人理解这个原理呢?我简单概括一下。应该有下面几点:
①、它描写叙述的是一个应用程序环境的信息。即上下文。
②、该类是一个抽象(abstract class)类。Android提供了该抽象类的详细实现类。
③、通过它我们能够获取应用程序的资源和类,也包含一些应用级别操作,比如:启动一个Activity,发送广播,接受Intent信息等。
说了这三点好像你还有点模糊,那我就总结来说。
总结就是:Context是一个抽象基类。我们通过它訪问当前包的资源(getResources、getAssets)和启动其它组件(Activity、Service、Broadcast)以及得到各种服务(getSystemService),当然,通过Context能得到的不仅仅仅仅有上述这些内容。
对Context的理解能够来说:Context提供了一个应用的执行环境。在Context的大环境里,应用才干够訪问资源,才干完毕和其它组件、服务的交互。Context定义了一套主要的功能接口,我们能够理解为一套规范,而Activity和Service是实现这套规范的子类。这么说或许并不准确,由于这套规范实际是被ContextImpl类统一实现的,Activity和Service仅仅是继承并有选择性地重写了某些规范的实现。
2、我们来看一下context的相关类的继承关系
通过图上我们能够看出:Activity类 、Service类 、Application类本质上都是Context子类,知道为什么老是在这些里面用到context了吧?
3、Application、Activity和Service作为Context的差别
同样点:它们都间接继承了Context。
不同点:首先看它们的继承关系,通过对照能够清晰地发现,Service和Application的类继承关系比較像,而Activity还多了一层继承ContextThemeWrapper,这是由于Activity有主题的概念。而Service是没有界面的服务,Application更是一个抽象的东西。它也是通过Activity类呈现的。Context的真正实现都在ContextImpl中,也就是说Context的大部分方法调用都会转到ContextImpl中。而三者的创建均在ActivityThread中完毕,Activity启动的核心过程是在ActivityThread中完毕的,这里要说明的是。Application和Service的创建也是在ActivityThread中完毕的。
4、一个应用程序中有多少个context?
一个应用程序中究竟有多少个context?这个问题就是我们面试中最常见的,也是常常被问到的,看完以上三点的分析?你知道有多少个了吗?
答案显而易见:总Context实例个数 = Service个数 + Activity个数 + 1(Application相应的Context实例)
讲到这里我相信大家应该有所理解了吧?实在没理解的抽出时间去查一下源代码分析一下。深刻的理解一下。了解了我上边所说的那些内容之后,你在面试中遇到相关context的问题,基本上没问题了。
说完了两道题之后。有没有特别想期待第三题呢?
个人组织了一个高端Android微信交流群,有意向的能够先分享此文章到朋友圈,再加我微信,发送分享到朋友圈的截图给我。我把你拉进去。保你学到很多其它知识。能够第一时间收到干货推送。
微信号:smart_android (←长按复制)介绍:非著名程序猿。字耿左直右,号涩郎,爱搞机,爱编程,是爬行在移动互联网中的一名码匠!
个人微信号:loonggg
微博:涩郎
QQ群:413589216 很多其它资料和源代码尽在QQ群文件
今日头条:搜索“非著名程序猿”订阅很多其它信息
工作:专注于移动互联网的开发和研究。本号致力于分享IT技术和程序员工作心得体会。欢迎大家关注与转载。