Activity启动源码剖析

这里只列出简要几个流程,有时间再来详细分析其中的源码执行。
简要流程
第一步查找intent对应的activity,拿到packagemanager中保存的activityinfo,
第二步转换成ActivityManagerService中的activityrecord
第三步找到这个activityrecord对应的taskrecord和activitystack
这个步骤基本流程和对应的几个flag
第二步和第三步都在ActivityStack完成
第四步实际启动ActivityStack resumeTopActivity来完成
第五步根据需要是否启动应用进程,这里涉及到 一个进程启动流程
第六步应用进程ActivityThread完成Activity启动,Activity在应用进程中表示为ActivityClientRecord

这里跳过Activity、Context、ContextImpl中startActivity的处理,从ActivityManagerService

几个关键类
ActivityManagerService:android N上为了给ActivityManagerService减压,启动Activity的活交给ActivityStarter来做

ActivityStarter:
1 通过PMS查找ActivityInfo
2 拦截启动和权限检查等
2 创建ActivityRecord,这是Activity在ActivityManagerService存在的实体,到这一步Activity才叫启动
3 查找task、stack

ActivityStackSupervisor :
activitystack管理,创建activitystack(在分屏中)

ActivityStack:task管理,调用

ActivityThread:响应activitystack各种回调,将这些调用转到应用主线程消息队列来执行

Instrumentation:完成生命周期转调用

这里几个重要的步骤点
1 通过intent查找activityinfo,这个在PMS中,在分析PMS的时候在分析
2 根据activityinfo创建activityrecord,这个时候才标志这个activity会被启动
3 启动activityrecord需要先找到组织,所属的task(TaskRecord),stack(ActivityStack),这个在另外一篇文章中讨论
4 启动activity过程中app进程没有启动,需要先启动进程,启动进程后会创建application,这个流程在另外一篇文章中讨论
5 启动activity过程中前一个activity没有onPause,需要先pause前一个activity,然后在resume要启动的activity。

相应的流程图如下:




猜你喜欢

转载自blog.csdn.net/xuning2516/article/details/79942805