上一篇讲了Android系统启动流程(https://www.jianshu.com/p/0237075b5bf0),本篇将笔墨着重在Activity的启动流程上。介绍Activity启动流程的文章很多,在本文中将不详细介绍,虽然我也写过详细的启动流程文章,但每每阅读都觉得费时费力,所以在这里主要以流程图和简单的叙述来概括Activity启动流程。如果想详细了解,可参考老罗的Android之旅(https://blog.csdn.net/Luoshengyang/article/details/6685853)。
在接下来的叙述中,以在Launcher上启动进程A的ActivityB为例。
一、Activity的管理方式
贴一张Android启智观的Activity数据结构,出自https://duanqz.github.io/2016-02-01-Activity-Maintenance:
- AMS中每一个Activity都是以ActivityRecord进行管理。
- AMS中每一个进程都是以ProcessRecord进行管理,一个ProcessRecord包括多个ActivityRecord。
- 一个设备有一个ActivityStackSupervisor,一个ActivityStackSupervisor包含多个Activitystack。
- 根据启动模式创建Activitystack和TaskRecord,一个Activitystack包含多个TaskRecord,一个TaskRecord包括多个ActivityRecord。
二、pause
在Launcher上点击进程A的图标,在此省略掉Input事件的分发流程,以Launcher中调用startActivity函数作为起点。
- Launcher通过Binder通信调用ActivityTaskManagerService的startActivity函数
- 在ActivityStarter的startActivity函数中,检查是否可以启动进程A的ActivityB,这里包括权限控制,限制后台应用启activity(具体可参考https://juejin.im/post/5ce8b612f265da1b614fd30e)等,然后找到或者创建ActivityB的ActivityRecord。
- 在ActivityStarter的startActivityUnchecked函数中,根据启动模式找到或者创建对应的Activitystack和TaskRecord,将创建的ActivityRecord放入到TaskRecord。
- 在ActivityStack的resumeTopActivityInnerLocked函数中,先去pause掉Launcher,若是启Acitiity时设置FLAG_RESUME_WHILE_PAUSING标识,则不等待Launcher pause完毕就直接resume ActivityB。因为没有设置,所以需等待。
- AMS binder调用Launcher,执行ActivityThread的performPauseActivity函数,从而调用到Activity的onPause函数。
- 这里提到的PauseActivityItem,以及下面会提到的LaunchActivityItem、ResumeActivityItem、StopActivityItem、DestroyActivityItem等都是属于策略模式。
三、startProcess
- Launcher通过Binder通信调用ActivityTaskManagerService的activityPaused函数。
- 再次调度到ActivityStack的resumeTopActivityInnerLocked函数中,判断ActivityB是否关联了进程A,这里为冷启动,所以不关联,则调用ActivityStackSupervisor的startSpecificActivityLocked函数。
- 在ActivityStackSupervisor的startSpecificActivityLocked函数中,判断进程A是否存在,这里为冷启动,所以不存在,则启动进程A。
- 启动进程A的方式为Socket通信Zygote,复制Zygote获得一个虚拟机实例拷贝,在进程A的主线程上调用ActivityThread的main函数,并调用ActivityThread的bindApplication函数。
四、resume
- 进程A通过Binder通信调用ActivityTaskManagerService的attachApplication函数。
- 在ActivityStackSupervisor中realStartActivityLocked函数中,Binder通信进程A,调用ActivityThread的performLaunchActivity函数,从而调用到Activity的onCreate函数;调用ActivityThread的performResumeActivity函数,从而调用到Activity的onStart函数和onResume函数。
五、stop
- 进程A在主线程空闲时通过Binder通信调用ActivityTaskManagerService的activityIdle函数。
- 在ActivityStackSupervisor的activityIdleInternalLocked函数中,取出mStoppingActivities中的Launcher(在ActivityStack的completePauseLocked函数中放入),Binder调用Launcher,然后调用ActivityThread的performStopActivityInner函数,从而调用Activity的onStop函数。
- 如果Launcher所在的Activity的finish函数被调用,则 在ActivityStackSupervisor的activityIdleInternalLocked函数中还会取出mFinishingActivities中的Launcher(在ActivityStack的finishCurrentActivityLocked函数中放入),Binder调用Launcher,然后调用ActivityThread的performDestroyActivity函数,从而调用Activity的onDestroy函数。