activity的启动关闭最终都是由AMS控制的。从刷了rom到第一开机引导、launcher启动、点击启动特定app,这之间ams控制开机引导activity、launcher、app启动有什么不同吗?还是same流程?下面让我们一探究竟。
文章分三部分:第一部总体概述、第二部分流程图、第三部分讲解下具体一些细节点。
一、总体概述:
无所做什么,一定先是了解概况,然后在看细节,不然就是只见树木不见森林。
这里就会有区分,开机广告/开机引导类似(电视现在都是先播放广告,然后启动launcher)、launcher、其他app;
本文也从这个角度进行一下分析。
简单的说,启动一个activity,先看是否已经有activity是resume状态,没有则直接启动;有则先pause掉当前resume的,然后启动想启动的;这里也不关注activity如何调用到AMS的,只关注AMS内部如何调度最终启动相关的activity的。
除了开机广告,launcher和app启动都是两个阶段:一pause当前resume的activity;二resume需要启动的activity。(先finish后pause)
牢记,就这两个阶段,不过launcher和app启动在这两个阶段有些许的区别而已。
开机广告就不多说了,后面也会给出AMS添加的方案,从AMS直接启动广告Activity播放广告,然后主动finish;系统会启动Launcher;点击相关app,启动自己想打开的应用(顺序三个阶段)。
二、流程图
1.正常启动Launcher
这里先看下正常情况下的Luancher启动,即开机即启动Launcher。然后在看下先播放开机广告,然后在自动Launcher,看下异同点。
AMS被SystemServer启动之后,SystemServer会通过AMS调用startHomeActtivity启动Launcher,流程见上流程图。
其中有几个关键函数,需要关注一下:startHomeActivityLocked、startActivityLocked、addActivityToTop、resumeTopActivityLocked、realStartActivityLocked、attachApplicationLocked;几个点记住:ProcessLocked中有Process.start,最终会触发AMS的attachApplication。
从流程途中看到,起点可以算startHomeActivityLocked,终点是realStartActivityLocked;
第一阶段是startHomeActivity,触发activity的进程创建;第二阶段就是AMS的attachApplication在进程创建后被调用,最终执行realStartActivityLocked会回调Activity的onCreate函数。
这里第一阶段和上面说的不太一样,不过没关系,下面看下先播开机广告在启动launcher的流程。
2.开机广告之后启动Launcher
AMS启动广告的就不看了,看下广告finish之后,Launcher启动的流程:
先看下调用栈:
第一阶段:开机广告finish掉,触发paused: