「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
Activity的创建过程
main进程
- [需了解]
- mInstrumentation:跟踪application及activity生命周期的功能
- AMS是通过ActivityStack及其他数据结构来记录,管理系统中的Activity及其他组件状态的,并提供查询功能的一个系统服务(Activity Manager Service)。
通常我们启动Activity有点击图标和通过一个Activity中的startActivity两种方式。
当通过startActivity启动时:
Intent intent = new Intent(this,MainActivity2.class);
startActivity(intent);
这只是表面的api调用,实际是mInstrumentation创建activity,但是mInstrumentation还是比较上层的调用,在mInstrumentation这一层更多的是对activity的创建条件做检测, 比如activity是否存在,activity是否在配置文件中注册等,mInstrumentation会将最终生成的任务交给AMS,但是AMS运行在system_server 进程,这里涉及到跨进程通信,所以在app进程中会通过ActivityManagerNative的mremote即AMS的远程代理来调用AMS
system_server进程
前面提到AMS可以通过ActivityStack及其数据结构来记录,管理系统中的Activity,那么当任务传递到AMS时一定会涉及到ActivityStack的检测与记录
- [需了解]
- ActivityStack是一个管理类,用来管理系统所有Activity的各种状态,其内部维护了TaskRecord的列表
- ActivityStackSupervisor 管理ActivityStack 两者关系
在此过程中,主要对activity的创建的相关参数进行了一些加工,以及对activity进行了记录。在完成了这一系列工作后,AMS又将工作交回给了main进程,这里是调用main进程的代理对象IApplicationThread
这里的app.thread实际是main进程的代理对象IApplicationThread
main进程
当任务又回到main进程后,会通过handler交给具体的线程去处理
通过类加载器创建activity
并尝试创建application,当如如果application已经存在就不会创建
activity最终还有一个attach的过程,这个过程和之后的view的创建有关,在attach结束之后会通过Instrumentation的callActivityOnCreate方法来回调onCreate方法,至此activity创建过程结束