有些东西,大家天天都能看到,但并不一定了解和在意它。在Android开发中,加载资源,启动一个新的Activity,获取系统服务,获取数据库路径,创建一个View等都会使用到Context。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”为“上下文,背景,环境,语境”,有点抽象。对照上面的英文,也很容易理解它的意思:Context提供了一个应用的运行环境,通过这个上下文应用才可以访问资源,才能完成和其他组件、服务的交互。它就是一个调用者和具体实现的桥接。
再看看这个图,可以直观的了解Context相关类的继承关系:
具体的实现,大家可以看一看ContextImpl这个类的源码,理一下它和LoadApk的关系,大家就会很容易明白Context是如何处理资源的。
注意:上图中的mPackageInfo是一个LoadApk对像,这个LoadApk是一个hide类型的类,所以你在SDK中是找不到它的。
但是,面对天天见的“大众脸同学”Context,很多人更想知道,理解它有什么实际的意义。做应用开发,我们只要会使用它不就行了吗?
我先问一个简单的问题:
Application(或者Service)和Activity都可以调用Context的startActivity方法,那么在这两个地方调用startActivity有区别吗?
如果你曾经遇到过,就会知道在Application(或者Service)需要给Intent设置Intent.FLAG_ACTIVITY_NEW_TASK才能正常启动Activity,这就会引出Activity的Task栈问题,以后再做分析。
理解Context,对于我经历的项目来说,最有用的就是对于插件框架的开发了。如果有面试官问你:
Context的实例是什么时候创建的?一个应用里面会有几个Context的实例?
对于一般的应用来说,你会觉得这两个问题很无聊。但如果你需要做插件开发,上面的问题就变成是很关键的问题了。你的插件框架会是一个小型的Android Framework层,你当然得自己处理插件的Application和Activity创建,那么你肯定要解决好这两个问题。详情可以查看ActivityThread这个类的源码。
也就是说,如果我要招一个做插件开发的人,我肯定要了解一下他对这些问题的看法。或者一个人的简历上说他对Android Framework层很精通,也可以拿这些问题检测一下。
小结
有网友问“面试官是怎么考虑求职者的经验、学历、编程水平”这些方面的,其实这个问题不能脱离实际的公司和项目来回答。我只能说几个场景,有些公司有人才培养计划项目也不紧张,那么他们在招人时是以培养和贮备为目的,会更重视面试者的理解和学习能力。但如何一家公司急切需要人进来解决问题,他们就会更在乎你的项目经验了,最好是直接招以前就做过类似项目的。如果一家公司只是需要码农来搬代码,那么只要不是太差的,他们会更看重性价比。
所以有公司关注这些对Context或Framework方面的理解的面式题,一是他们应用可能遇到了一些问题,需要一些对机制比较了解的开发来解决;二是想通过这类问题,考察面试者是否真如简历上般资深,因为他们相信做多了项目的人,很容易遇到机制方面的问题(如Dex的65535方法数限制)。