AMS-启动Activity之三

                  AMS-启动Activity之三_第1张图片

根据前面的介绍,当启动一个新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的交互




你可能感兴趣的:(移动开发综合)