最近感觉很心烦,总感觉很多事情,人生谁不是45度的,谁能真正躺的下去,又有谁可以完全是一个奋斗比,一
直向上呢?现在行情不好,感觉啥都难。来新公司一年了,晋升也没有名额,但是我给自己的预期是,晋升-涨
薪-成长,三个多少有一样,不然真的废了。现在值得开心的就是,本来我的博客是属于我个人的学习记录,没有
想到有人评论了,看来后面需要坚持写下去了,算是给自己立一个flag吧。
why:
很多人说,我为什么要关注Activity的启动呢?我工作中也很少用的到。
- 首先对于你常用的东西,要有了解,工作原理是什么,这个知识点是必备的,后面排查问题都有帮助,换句话说,跳槽面试必备的,bros。就算你奔着面试去,你也要了解一下不是?
- 同时Activity的启动流程,也是学习插件化的第一步(我就是酱紫的),简单来说,插件化就是通过很多的方式通过反射“欺骗”的方式,各种干扰Activity的正常启动逻辑,达到预期的效果。如果你要学习一门技术,连一个页面启动方式都不懂,怎么说得过去呢,是不?
- 举一个简单的例子哈,就是之前在上家公司的时候,同事面试,问一个美团候选人,Activity的启动流程,回答巴拉巴拉,然后来一句,后面经过一系列的流程,同事问,“一系列的流程”是什么?,候选人说,忘记了,结果就挂了。我没有其他意思,我想说,很多东西还是要仔细学一下的,这种东西,要印象深刻的哈。
目标
- 知道Activity的大体启动流程,并能划出核心流程图。
- 知道Activity启动一些关键类,以及一些关键对象,他们的职责是什么。
注意:我这里可能会画一个大概流程图,可能会比较粗糙,而且没有代码分析,心里有一个大体的印象就行,自己可以跟代码自己走一遍。(ATMS是Android10引入,之前是直接和AMS打交道的)
Activity启动流程
同进程或者跨进程,这一部分是一样的
这里会有区别,同一进程直接走下面的逻辑,如果不是,会先创建一个进程,Zygote会fork出一个,反射创建 ActivityThread,并执行其中的main方法。Main方法中,可能就有创建Looper,Application。
关键类解释
- ATMS
- 这个类主要是负责Activity启动的Service,Android10之前都是直接和AMS打交道,个人感觉可能感觉职责太大,就把Activity的启动给单独交给ATMS,职责单一一些吧。
- AMS
- 这个Service就比较重要了,就是负责维护四大组件的,以及调用管理他们的生命周期。
- ActivityThread:
- 这个其实就是我们说的UI线程。进程有的时候就会被创建,代表了当前应用程序。有一个内部对象Application,这个就相当于ActivityThread的上下文。
- ApplicationThread
- 是一个Binder,在ActivityThread内部持有。负责和远程服务通信,是属于APP进程的。并在ActivityThread创建之后,注册到AMS中,AMS就会有一个代理类,后续AMS可以通过ApplicationThread给APP进程通信。
- H
- 就是一个Handler,也是在ActivityThread内部持有,负责消息的接收和分发。交给ActivityThread处理。
总结和反思
这里其实,我们要知道Activity启动的大体流程,中间的一些关键类是做什么的,怎么进行进程间通信的(要需要有Binder代理类,这些对象啥时候注册的),脑子里面有一个关键的轮廓,我理解达到了预期。
也会有很多思考,比如:
- 我们获取到一些Service,这些Service有什么我们可以借鉴的吗?
- 比如AMS(这个是Android手机系统持有的,不是一个APP一份,所有的APP都是供它调度的),系统有统一的获取方式,这些Service在手机启动的时候就只有了,放在了ServiceManager(这个后面会说)。很类似我们APP工程的Service,在模块化工程,我们通常也会在Application的onCreate的时候,把我们需要的各种Service,比如ImageService,NetWorkService放到一个容器中,然后在使用的时候统一获取。很多东西确实是相通的。