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方法数限制)。

    相关文章

      网友评论

      • SuperBaby酱:context用的是装饰者模型,contextIml是context的实现类,contextwrapper内的参数是context,用的时候把context实例化成contextIml,调用其中方法起到装饰作用,不知道理解对不对
      • 13号大王:博主所说`LoadApk`应该是`LoadedApk`吧。系列文章真的很棒,谢谢!
      • 海朵朵的猫猫:大神,为何你抛出了问题我却没有看到答案:sob:
        海朵朵的猫猫:@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