今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲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技术和程序猿工作心得体会。欢迎大家关注与转载。


常见面试第二题之什么是Context的更多相关文章

  1. 常见面试算法题JS实现-设计一个有getMin功能的栈

    前言: 已经确定工作了-下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书, ...

  2. 常见面试算法题JS实现-仅用递归函数和栈操作逆序一个栈

    前言: 因为JAVA和JS语言特性的不同,有些东西在JAVA中可能需要一些技巧和手段才能实现的复杂程序,但是在JS中可能就是天然存在的,所以这套书里面的题目不会全部用JS去实现一遍,因为可能JS的实现 ...

  3. Android开发面试经——6.常见面试官提问Android题②(更新中...)

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/fi ...

  4. Android开发面试经——5.常见面试官提问Android题①

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...

  5. 19道常见的JS面试算法题

    最近秋招也做了多多少少的面试题,发现除了基础知识外,算法还是挺重要的.特意整理了一些常见的算法题,添加了自己的理解并实现. 除此之外,建议大家还可以刷刷<剑指offer>.此外,左神在牛客 ...

  6. 数据结构+算法面试100题~~~摘自CSDN

    数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调 ...

  7. Android常见面试笔试题目

    Android常见面试笔试题目 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 答:可以处理消息循环的线程,他是一个拥 ...

  8. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  9. linux运维面试精华题

    Linux运维跳槽面试精华题|第一集 1.什么是运维?什么是游戏运维? 1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络 ...

随机推荐

  1. Java异常处理和设计【转】

    Java异常处理和设计 在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常 ...

  2. 超链接的那些事(三): 属性target

    a标签的属性之一 target 1. 定义     规定在何处打开链接文档. 如果a标签中有target属性,浏览器将会载入和显示用这个标签的 href 属性命名的.名称与这个目标吻合的框架或者窗口中 ...

  3. hdu 3367 Pseudoforest(最大生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  4. C++ new(1)

    如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数.在这里,和 sizeof 类似,new 和 delete 也不是函数, ...

  5. Design Tip #142 Building Bridges

    http://www.kimballgroup.com/2012/02/design-tip-142-building-bridges/ The dominant topologies of Data ...

  6. [转]ionic $state.go passed $stateParams

    本文转自:http://stackoverflow.com/questions/19516771/state-go-toparams-not-passed-to-stateparams If you ...

  7. c++字符串互相转换

    1.string vs char* //string to char* string str; const char* cch = str.c_str(); ]; strcpy(ch,cch); // ...

  8. Vim tips

    1.光标移动: (1).NG -> 移动到第N行,或者使用:N (2).gg -> 移动到第一行 (3).G -> 移动到最后一行 (4).单词移动: w -> 移动到下一个单 ...

  9. 【Android UI设计与开发】5.底部菜单栏(二)使用Fragment实现底部菜单栏

    既然 Fragment 取代了TabActivity,当然 TabActivity 的能实现的菜单栏,Fragment 当然也能实现.主要其实就是通过菜单栏的点击事件切换 Fragment 的显示和隐 ...

  10. mac os下得pycharm怎么设置mercurial?

    捣鼓了一会儿,最终搞定了. 先把链接贴上来:https://www.jetbrains.com/pycharm/help/mercurial.html 如果你发现你的pycharm在设置mercuri ...