背景

惯例,先简单陈述一下自己的,91年生人,164年三本毕业后在深圳工作,末流小公司,工资13k,无房,无车,无户口。

那时候感觉生活也还行,父母有退休金,我基本上不用太操心,女朋友在一起很久了,很体贴,没有怎么要求我。

本来生活就这样一帆风顺下去我就满足了,但是去年初,女朋友家里出了一些事情,一点积蓄全给她了,后面疫情来了,家里开始催婚了,我感觉到了压力。

目前的工资无法满足生活,虽然这些年来有一点点的提升,但是,房价物价涨的更快,于是我决定跳槽。

从去年年底开始瞎投简历,回顾了一下,一共投了33份简历吧,只有3家企业感兴趣,还0家约面试。

(一开始还非常悲伤,后面……后面就习惯了)

接着就厮混了一阵子,就忽然间意识到不管是经济的寒冬,还是我的寒冬,都来了。

面试官提了一个问题,我们来看看 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 回调耗时的话,也会影响这些待启动组件的启动时间

面试官:可以,我们再来聊聊别的。

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

  • 自行下载直达领取链接:【点击我即可获得!】
  • 以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点这里可以看到全部内容】。

部内容](https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF)】。**

[外链图片转存中…(img-v2HPgp1p-1623224195333)]

Android程序员如何有效提升学习效率?帮你突破瓶颈相关推荐

  1. 安卓内存监控apk,Android程序员如何有效提升学习效率?深夜思考

    开头 昨天去面了一家公司,价值观有受到冲击. 面试官技术方面没的说,他可能是个完美主义的人,无论什么事情到了他那里好像都有解决的方案,我被说的无所适从,感觉他很厉害. 但我不能认可的是,面试官觉得加班 ...

  2. 最新阿里P7技术体系:Android程序员如何有效提升学习效率?使用指南

    开头 先说一下我大概的情况吧.渣本毕业,工作已经有快两年了,从高中就开始玩小破站.无论是学习还是日常放松都是在b站.大学主学的软件技术专业,所以,进大学校门那一刻起,去上海bilibili工作就在心里 ...

  3. Android自定义控件开发入门与实战(11)Xfermode,Android程序员如何有效提升学习效率

    mPaint = new Paint(); mPaint.setColor(Color.BLACK); mBitmap = BitmapFactory.decodeResource(getResour ...

  4. 成功入职字节跳动!Java程序员如何有效提升学习效率

    开头 消息队列 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积 ...

  5. 十年Android程序员图解:用图帮你了解https的原理

    Http存在的问题 上过网的朋友都知道,网络是非常不安全的.尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵.还有大家平时喜欢用的万能钥匙,等等.那我们平时上网可能会存在哪些风险呢? 泄密, ...

  6. 2020倒计时,大厂核心送给每一个脚踏实地努力着的Android程序员,逆风前行

    Android前景的压力: 面试的压力: 寒冬的压力: <Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义>开源 年龄的压力: 等等- 其实每个人都有自己的 ...

  7. Android程序员的十大转型之路

    IT行业是一个瞬息万变的行业,程序员是一个不进则退的职业.我作为一个Android程序员,多年来一直保持随时可以转型其他技术领域的状态,保持对新技术敏感的嗅觉. 我先说说Android程序员不可能转型 ...

  8. Android 程序员必须掌握的三种自动化测试方法

    原文地址:http://www.cnblogs.com/punkisnotdead/p/5103323.html 在日常的开发中,尤其是app开发,因为不像web端那样 出错以后可以热更新,所以app ...

  9. 挨踢部落故事汇(20):Android程序员的十大转型之路

    玖哥是一个来自东北的Android攻城狮,现在定居被誉为"大湖名城,创(chuan)新(xiao)高地"的合肥.知识面极广,不仅广泛涉猎IT相关知识,还热爱文学,性格幽默,被誉为& ...

最新文章

  1. 使用合成数据集来做目标检测:目标检测的介绍
  2. nanodet学习笔记 tensorrt
  3. mysql 记录所有操作_mysql 的一些记录的操作
  4. Verilog MIPS32 CPU(八)-- 控制器
  5. 项目开发中发布更新文档备注
  6. 【clickhouse】clickhouse 同时查询数过多 Too many simultaneous queries
  7. js获取服务器响应头信息,请问,js中请求头信息和返回头信息的方法
  8. unity小技巧总结
  9. SQL Server中唯一索引和唯一约束之间的区别
  10. LeetCode简单题目(二叉树相关)(#100 #101 #104 #107 #108 #110 #111 #112)-8道
  11. 7-12 文件传输 (25 point(s))
  12. Numpy快速入门教程
  13. mfc中CImageList的使用
  14. 微信内置浏览器cookie设置问题
  15. 雷达图按照权重和排名计算出每项得分,并且按照综合得分排序
  16. java输出英文字母_用JAVA编一个程序输出全部的英文字母
  17. 计算机软件考试成绩查询时间,2020年计算机软考什么时候出成绩,怎么查成绩?|...
  18. 基础类库,注释,异常,集合,泛型
  19. 如何修改网页视频播放倍速?(最高16倍速)
  20. ubuntu16.04调整屏幕分辨率

热门文章

  1. python 平滑曲线
  2. 卷积神经网络中的各种池化操作
  3. NVIDIA Display Container LS 服务意外地终止
  4. 2018年视觉所有干货博文的分类汇总
  5. 前景检测算法_4(opencv自带GMM)
  6. 『TensorFlow』函数查询列表_张量属性调整
  7. eclipse 无法解析导入 javax.servlet 的解决方法
  8. 基于直方图均衡化的水下激光图像处理(MATLAB仿真)
  9. Linux内核OOM机制的浅析
  10. Cissp-【第3章 安全工程】-2021-1-31(205页-237页)