Android面试一天一题(10 Day)

作者: goeasyway | 来源:发表于2016-06-08 13:29 被阅读6117次

有些东西,大家天天都能看到,但并不一定了解和在意它。在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方法数限制)。

相关文章

  • Android面试一天一题-goeasyway

    以下文章作者:goeasyway Android面试一天一题(1 Day) Android面试一天一题(2 Day...

  • MS(1):Android之架构篇

    一、架构相关 1、MVC,MVP,MVVM MS思考:Android面试一天一题(Day 33:Android开发...

  • 面试题

    最全的BAT大厂面试题整理答案Android面试一天一题(Day 37:一套高级工程师的面试题)Android面试...

  • MS(2):Android之基础知识篇

    二、组件 1、Activity----------1 MS思考:Android面试一天一题(3 Day):Acti...

  • MS(7):非技术问题篇

    一、GM问非技术问题汇总 MS思考:Android面试一天一题(Day 34:常去的Android相关站点) 说下...

  • MS(3):Android之机制原理篇

    五、重点机制原理 1、Handler机制 MS思考:Android面试一天一题(8 Day):Handler相关分...

  • MS(5):android之进阶篇

    七、自定义View MS思考:Android面试一天一题(Day 30:老外的自定义View面试题)MS思考:老外...

  • android Service 一些思考

    看了Android面试一天一题(1 Day),对Service 的一些总结与思考 作者原文章链接: http://...

  • MS(6):Java篇

    MS思考:Android面试一天一题(7 Day):Java相关 1.Switch能否用string做参数? 在J...

  • 读goeasyway文章有感

    今天在地铁上读goeasyway的文章《Android面试一天一题(Day 39:写博客很重要吗?)》,很有感触,...

网友评论

  • SuperBaby酱:context用的是装饰者模型,contextIml是context的实现类,contextwrapper内的参数是context,用的时候把context实例化成contextIml,调用其中方法起到装饰作用,不知道理解对不对
  • 13号大王:博主所说`LoadApk`应该是`LoadedApk`吧。系列文章真的很棒,谢谢!
  • c7f501c8f3a1:大神,为何你抛出了问题我却没有看到答案:sob:
    c7f501c8f3a1:@goeasyway 这个答案 我是服气的 :joy:
    goeasyway: @海朵朵的猫猫 我比较坏😜
  • trycatchx:Context 的创建都是写在在activityThread 里面,通过ams夸进程调用的。
  • JokAr_:为什么dialog 不能用application.context
    trycatchx:@_JokAr 可以设置属性,变为系统级弹框
    JokAr_:@goeasyway 谢谢
    goeasyway:@_JokAr 看这篇说明http://www.jianshu.com/p/628ac6b68c15
  • 112f37f12fe1:是不是一个应用里面有1+多少个activity+多少个service 个context?
    trycatchx:@可乐_雪碧 系统多进程就不止了。
    望北8261:BroadcastReceiver中的Context是从哪里来的
    XiaLong:@可乐_雪碧 是这样的,那个1就是Application
  • Jieqiudedede:大神你的问题没有分析啊,只是扔了个代码链接啊
  • 亼亼:因为我不是做安卓的。:blush:
  • 亼亼:小结的第一段但也值得学习。却是面试的时候因公司而异,因面试官而异。
  • 8314e3a0c30e:这就会引出Activity的Task栈问题,以后再做分析。 ——能否简单说说,为啥 service里启动activity要加flag?
    RyanYans32:非Activity环境下没有所谓的任务栈,需要手动在intent上设置NEWTASK标记,系统在启动的时候才会创建一个新的任务栈。
    e3b23f57fbb1:@赵丰年 可以看看android艺术探索这本书,上面有讲解
    李文文丶:@赵丰年 依我愚见,activity前台是在栈里创建的,后台service是不在所属activity的栈里,所以如果service要进行activity跳转,需要给跳转的activity前台新建一个存储activity前台的栈。即以new task方式。不过我觉得可以用启动模式为new task的方式,而不用加flag。我回去试试再评论

本文标题:Android面试一天一题(10 Day)

本文链接:https://www.haomeiwen.com/subject/lbxkdttx.html