涉及的主要类
1.ActivityThread
App的入口,进程中主线程的在main
方法中执行。
2.ActivityTaskManager
此类提供有关Activity
及其任务栈(如任务,堆栈和显示)的信息,并与之交互。
3.ActivityTaskManagerService
安卓10新增的类,主要负责activity的管理和调度工作,System service for managing activities and their containers (task, stacks, displays,... ).
4.ActivityManagerService
继承自IActivityManager.Stub
负责四大组件的、进程,生命周期与状态的切换。
5.ActivityStackSupervisor
负责activity栈的管理,这个类的解释很有意思,估计谷歌下一步会改动这个类,看todo:
1 | // TODO: This class has become a dumping ground. Let's |
从startActivity
开始
1.当我们需要开启一个Activity
的时候,通常都是通过调用startActivity(intent)
方法。在Activity
类中:
1 | startActivity(intent); ---> |
ActivityTaskManagerService
1.上述最终调用到ActivityTaskManagerService.startActivity
:
1 |
|
ActivityThread
上述所做的准备工作最终还是回到ActivityThread
的方法handlePauseActivity
,几个关键的方法handlePauseActivity
–>performPauseActivity
–>performPauseActivityIfNeeded
。重点看这个方法:
1 | private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) { |
ActivityThread中的重要内部类‘H’
1.H
:ActivityThread的一个继承Handler的内部类。activity的启动涉及到请求系统的服务,跨进程IPC通信,最终需要处理返回的请求信息。自然会想到Handler
消息机制,当请求启动activity时,通过ActivityManagerService、ActivityTaskManagerService
等一些系统的服务,包括进程的开启,activity状态信息的保存。任务栈信息,最后完成创建。
总结
Activity
的启动流程,复杂且繁琐,代码很多,这里大概分析一部分流程,其中包括falgs等信息不在追究细节,做到大概心中有数;对关键方法了解。有其他需求时可对细节进一步细致查看。
1.开发者通过调用startActivity
或者startActivityForResult
最终调用startActivityForResult
,以此向ActivityManagerService
发送启动请求。
2.ActivityManagerService
做一些初始化工作,包括启动模式,状态。10.0开始启动工作startActivity
由ActivityTaskManagerService
来完成。
3.判断当前栈顶是否有activity对象,如果有,则执行栈顶activity的onPause
流程,(onPause
–>源码的启动流程从侧面反应出,此方法不适合做太耗时的操作,为了新创建的activity启动更顺畅)。
4.当栈顶activity的onPause方法执行完成时,待启动的activity就绪,此时分为冷启动与热启动。若被启动过则执行的是:onRestart->onStart->onResume
。冷启动则涉及到fork
进程过程。首先对main线程初始化。
5.若被启动的activity主线程与进程已经初始化完成,这时主要对activity一些配置,包括主题,关联application等,onCreate->onStart->onResume
。
待执行完成,调用者activity会执行onStop方法,启动流程结束。