根据前面的介绍,当启动一个新Activity时,系统将先行处理当前的Activity,即调用startPausingLocked()函数来
暂停当前Activity。
ActivityStack#startPausingLocked()
* 调用当前Activity所在进程的ActivityThread#schedulePauseActivity(...)
ActivityRecord prev = mResumedActivity;
mPausingActivity = prev;
//...
prev.app.thead.schedulePuaseActivity(prev, prev.finishing,userLeaving, prev.configChangeFlags);
这个schedulePuaseActivity()会在binder线程中执行,最终主要逻辑在该进程的主线程中执行,即
schedulePuaseActivity()中向主线程消息队列发送PAUSE_ACTIVITY消息,最终由handlePauseActivity
处理。
* 设置Pause超时,时间为500毫秒
mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
ActivityThread#handlePauseActivity(IBindler token, boolean finished, boolean userLeaving, int configChanges)
* 调用Activity的onPause
performPauseActivity(token,finished, r.isoreHoneycomb())
* 调用AMS的activityPause函数,activityPause调用ActivityStack#activityPause()
ActivityManagerNative.getDefault().activityPause();
ActivityStack#activityPause(IBinder token, boolean timeout)
* 移除超时消息PAUSE_TIMEOUT_MSG
* 调用completePauseLocked,完成pause Activity最后一步,并调用resumeTopActivityLocked启动目标Activity
ActivityStack#completePauseLocked()
* 将刚才被pause的Activity保存到mStoppingActivities中
* 启动目标Activity
if(!mService.isSleeping()) resumeTopActivittyLocked(prev);
由图中可知,此次目标Activity resume后(走完了onResume),被pause的Activity才刚走完onPause。
那onStop在哪里调用,之前的文章说了,目标进程的主线程消息队列没有其他消息时,回去处理Idler,
resume之前一直都会有很多消息的,在resume后,很快会有机会处理Idler,最终会去到ActivityStack#
actvityIdleIternal,它将会为mStopingActivities中的成员调用stopActivityLocked()。
ActivityStack#stopActivityLocked(ActivityRecord r)
r.state = ActivitySate.STOPPING;
r.app.thread.scheduleStopActivity(r, r.visible, r.configChangeFlags);
如前面的launchActivity和pauseActivity一样,最终会去到应用进程的主线程中。
scheduleStopActivity(...)将根据visible情况,向主线程消息循环发送H.STOP_ACTIVITY_HIDE
或H.STOP_ACTIVITY_SHOW消息。不论哪种情况,最终都由handleStopActivity来处理。
ActivityStack#stopActivityLocked并没有设置超时。
总结一下启动Activity的三篇文章:
1.首先利用am start命令,发起本次目标Activity的启动请求
2.进入ActivityServiceService和ActivityStack这两个核心类。对于启动Activity来说,
这流程可以细分为两个阶段。第一个阶段的主要工作就是根据启动模式和启动
标志找到或创建ActivityRecord及对应的TaskRecord;第二个阶段工作是处理
Activity启动或切换相关工作。
3.讨论了目标进程中直接创建目标进程并运行Activity的流程,其中涉及目标进程的创建,目标
进程中Android运行环境的初始化,目标Activity的创建以及onCreate、onStart、onResume
等其生命周期中重要的函数的调用
4.讨论了AMS先暂停当前Activity,然后再创建目标进程并运行Activity的流程。其中牵扯到两个
应用进程和AMS的交互