腾讯、阿里Android高级面试真题汇总,先收藏了
我究竟要不要学习Kotlin呢?
要回答这个问题,我们先把时间拨回到2017年5月18日,安卓团队在谷歌 I/O 2017 大会上宣布 Kotlin 成为官方头等支持语言。
彼时谷歌技术大牛 Steve Yegge 发表了一篇关于 Kotlin 的使用体会总结文章:“为什么说 Kotlin 比你们用的那些垃圾语言都好?”
一时间这条爆炸性资讯在引发的热议一直持续到了今天。

时间是检验真理的唯一标准,接下来我们来看看国内外技术专家,使用kotlin开发的感受!
Google Android 专家Annyce Davis:“当 Kotlin 出现时,我立刻被它吸引了,因为它的很多语法特性让我想起了 Groovy。它既整洁又精炼。”
Google Android 专家Sebastiano Poggi:“我真的真的很喜欢这门语言。我个人认为它在很多情况下使得编码变成一件愉快的事情,相比之前,同样的情况下用 Java 语言编码将会感到痛苦和繁琐。Kotlin 有时让我觉得自己就像一个 10 倍效率开发者。”
Google Android 专家Jorge Barroso:“Kotlin 迈出了 Android 开发的一大步,在这之前,Android 缺少 Kotlin 所带来的特性,相比于其他的 Java 平台,Android 平台的 Java 开发有些过时,即使现在有在推动 Java 8,但它还是不会变成我们喜欢的现代编程语言。
Google Android 专家Mark Allison:“虽然我也很喜欢 Kotlin,但我不认为它已经足够成熟到能够在线上产品中使用。成熟模式和最佳实践的缺乏,使得 Kotlin 编写的代码可能难以维护。”
Google Android 专家Dmytro Danylyk:“对于那些停留在 Android 世界的开发者而言,Kotlin 是一个真正的规则改变者,它拥有很多我喜欢的特性:空类型安全,data classes,属性和懒加载属性,扩展函数,协程,不变性等等。
我很享受使用 Koltin 来编码,因为我没有必要在项目中引入太多的第三方库,Kotlin 已经非常好的提供了大部分的支持。”
面试官提了一个问题,我们来看看 A、B 和 C三位同学的表现如何吧
A
面试官:说说 Application 的作用。
A:Application 是应用进程创建后就会创建的系统组件,所以可以用它来做一些初始化操作;Application 生命周期和应用进程一样长,所以可以用来给类库提供 Context; 因为在所有 Context 可以获得 Application 所以可以用来保存和传递全局变量。
面试官:你平常开发会把全局变量放在 Application ? 那应用在后台被回收,重新打开的时候值丢失怎么办?
A:会啊,很方便, 做一下容错判空就可以了
面试官:好的,回去等通知吧
B
面试官:说说对 Application 的理解
B:作用:做初始化操作、提供上下文。另外 Application 是一个 Context ,它直接继承了 ContextWrapper ;这个 ContextWrapper 的成员变量 mBase 可以用来存放系统实现的 ContextImpl,这样我们在调用 Application 的 Context 方法时,都是通过静态代理的方式最终调用到 ContextImpl 的方法。我们调用 ContextWrapper 的 getBaseContext 方法就能拿到 ContextImpl 的实例
面试官:你平常开发会把全局变量放在 Application ? 那应用在后台被回收,重新打开的时候值丢失怎么办?
B:不会,保存全局变量用静态变量,或单例可以把它们聚集在更合适的位置。
避免应用被回收数据丢失,可以页面传递参数时,通过 Intent 传递参数,这样被回收后打开重新从 Intent 取参还是有值的。数据量大的话也可以考虑数据持久化;另一个方法是通过 onSaveInstanceState 和 onRestoreInstanceState 分别在被回收时保存相应的数据以及在重新打开时恢复数据。
面试官:讲一下 Application 的生命周期吧
B:相比 Activity ,Application 的生命周期简直不要太简单。首先创建的时候会调用构造函数,然后系统准备好 ContextImpl 通过 attachBaseContext( Context ) 方法注入到 Application,接着调用我们最熟悉的 onCreate 方法。API 里还有一个 onTerminate 方法在进程被杀死的时候会回调,不过仅在模拟器生效,就不需要关注了。
面试官:那你能接着说一下 Application 的初始化流程吗?
B:基本上就是上面说的那些,再细没有去了解了
面试官:好的,回去等通知吧
C
面试官:说一下 Application 的初始化流程
C:Application 的初始化是在应用进程创建完成后:
ActivityThread 调用 AMS 的 Binder 对象( IActivityManager )的 attachApplication 方法
AMS 收到请求后再去调用 ActivityThread 的 bindApplication 方法
ActivityThread 这边收到请求再组装一个 AppBindData 对象,把所有参数封装进去,再通过 handler 发到主线程执行
主线程 loop 到这条消息,调用 handleBindApplication 来真正处理初始化 Application
handleBindApplication 和我们谈 “Context” 那次,Activity 的初始化差不多。回顾一下:
ClassLoader 加载 Application 类,实例化
初始化 Applicaction 用的 ContextImpl
通过 Application.attach( Context ) 方法,调用 attachBaseContext( Context ) 将 ContextImpl 注入到 Application
最后调用 Application.OnCreate()
这样 Application 就初始化完成了
面试官:为什么进程创建完成不直接调 handleBindApplication 去创建 Application 呢,又去 AMS 那边绕了一圈
C:调用 AMS 的 attachApplication 不仅仅是为了创建 Application ,还有在进程创建前可能调用了应用的四大组件却没办法启动;现在进程创建好了,创建好 Application 也要处理这些待启动的组件。所以需要通过 AMS 统一调度,如果 Application 的创建及 onCreate 回调耗时的话,也会影响这些待启动组件的启动时间
面试官:可以,我们再来聊聊别的。
尾声
一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!
最后需要同款资料的,可以点击这里【学习】我愿意分享给你!
为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!
https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF)我愿意分享给你!
为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!
再次感谢所有给我提供过题目的朋友们,感谢一路有你!
更多推荐

所有评论(0)