android 冷启动,android开启app过程( 四 )


//第一次进来的时候会在这里返回
return true;
}
if (next.app != null && next.app.thread != null {
//进行resume操作 {1}
}else{
// 这里会启动app进程 {2}
ActivityStackSupervisor.startSpecificActivityLocked(next, true, true);
}
因为之前已经新的activity做好入栈工作了 , 就是放在栈顶,所以通过topRunningActivityLocked可以找到它 。如果当前要resume的activity不是之前已经resume的activity,那么必须将pause之前的activity才行,具体工作分两部分完成:
pause其他所有已经focus的任务栈的mResumedActivity
pause当前任务栈mResumedActivity
两步都会调到核心函数是:ActivityStack.startPausingLocked
粗略介绍如下:
ActivityStack.startPausingLocked()
ActivityRecord prev = mResumedActivity;
// 变更ActivityStack中pauseActivity的记录
mPausingActivity = prev;
mLastPausedActivity = prev;
prev.setState(PAUSING, "startPausingLocked");
if (prev.app != null && prev.app.thread != null) {
// 通知APP执行pause操作
mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
PauseActivityItem.obtain(prev.finishing, userLeaving,
prev.configChangeFlags, pauseImmediately));
}
// 监控APP是否pause超时,时间只有500ms
schedulePauseTimeout(prev);
上面代码很简单,就是变更一下mPausingActivity的状态,然后通过LifecycleManager来通知APP进行pause操作,最后设置一下超时msg , 至此完成了所有resumedActivity的pause工作 。
7、Resume请求的activity
接上面 , 当APP pause以后,会回调activityPaused通知AMS,然后AMS会执行completePauseLocked 。该函数也会调用resumeTopActivityInnerLocked 。这一次,由于所有resumedActivity都已经paused了,所以返回的结果pausing为false,所以可以继续进行目标activity的resume工作 。
不过因为目标App的进程还没起来,所以上面的resumeTopActivityInnerLocked函数并没有真正做了resume操作,只是将target activtiy置为launching状态,通知前台的activity进行pause,然后调用startSpecificActivityLocked来启动进程,进程起来以后会再一次调到resumeTopActivityInnerLocked继续resume操作 。
如果不是冷启动,在通知前台activity pause以后,会在{1}(第6节中的resumeTopActivityInnerLocked函数)中进行resume的工作,然后通知target app进行resume操作 。所以在时序上应该是前台activity pause --> 目标activity resume,可以用图显示如下:

android 冷启动,android开启app过程

文章插图
图中虚线表示跨进程调用 , 同一种颜色表示同一个进程,启动时的入口是startActivtiyUncheck,app pause完了以后的入口是completePauseLocked 。
准备阶段总结
其实各节的小标题已经说的很清楚了,做了一下事情:
1.发起请求,主要是是表明身份和目的
2.解析Intent,验证合法性
3.创建ActivityRecord,建立activity的档案记录
4.分配Task,安排activity的位置
5.Pause前台activity,先下
6.Resume请求的activity,后上
除了第1点是在APP进程进行的 , 其实都是在SystemServer进程进行的 。