目前,移动开发已经处于饱和的阶段,AndroID开发也不如当年盛况,已经不再像前几年前那么火爆。正如一种编程语言如果经历过盛极一时,那么必然有这样的一条曲线,像我们学的正弦曲线先急速上升,然后到达顶点,然后再下降,最后再趋近一个平稳的值。
可以看到,从2016年的下半年开始,移动互联网基本处于缓慢发展的阶段,很多大佬称之为互联网的下半场。如果移动互联网的前半场是粗放式的强地盘阶段,那么下半场就是守地盘的阶段,这一阶段,会出现众多的寡头。
在技术上,相比之前之前面试只问AndroID四大组件,数据库,网络和项目经验不同,现在面试AndroID岗位会设计各种原理(包括系统的一些原理以及第三方库的原理及流程)、AndroID优化以及与AndroID相关的跨平台技术。除此之外,稍微大点的公司还会对App的用户体验、流畅度等等提出要求,所以说,AndroID的面试已经不可同日而语。
面试官提了一个问题,我们来看看 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 回调耗时的话,也会影响这些待启动组件的启动时间
面试官:可以,我们再来聊聊别的。
要如何成为AndroID架构师?搭建自己的知识框架,全面提升自己的技术体系,并且往底层源码方向深入钻研。
大多数技术人喜欢用思维脑图来构建自己的知识体系,一目了然。这里给大家分享一份大厂主流的AndroID架构师技术体系,可以用来搭建自己的知识框架,或者查漏补缺;
对应这份技术大纲,我也整理了一套AndroID高级架构师完整系列的视频教程,主要针对3-5年AndroID开发经验以上,需要往高级架构师层次学习提升的同学,在这里点击GitHub免费分享,希望能帮你突破瓶颈,跳槽进大厂;
最后我必须强调几点:
1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。
2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识
3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。
你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境
完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。
你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境
总结以上是内存溢出为你收集整理的全套学习!如何快速的开发一个完整的直播app,面试必问全部内容,希望文章能够帮你解决全套学习!如何快速的开发一个完整的直播app,面试必问所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)