Android应用程序启动过程源代码分析(7)

Step 10. Activity.resumeTopActivityLocked

这个函数定义在frameworks/base/services/java/com/Android/server/am/ActivityStack.java文件中:

public class ActivityStack {          ......          /**      * Ensure that the top activity in the stack is resumed.      *      * @param prev The previously resumed activity, for when in the process      * of pausing; can be null to call from elsewhere.      *      * @return Returns true if something is being resumed, or false if      * nothing happened.      */       final boolean resumeTopActivityLocked(ActivityRecord prev) {           // Find the first activity that is not finishing.            ActivityRecord next = topRunningActivityLocked(null);              // Remember how we'll process this pause/resume situation, and ensure            // that the state is reset however we wind up proceeding.            final boolean userLeaving = mUserLeaving;           mUserLeaving = false;              if (next == null) {               ......           }              next.delayedResume = false;              // If the top activity is the resumed one, nothing to do.            if (mResumedActivity == next && next.state == ActivityState.RESUMED) {               ......           }              // If we are sleeping, and there is no resumed activity, and the top            // activity is paused, well that is the state we want.            if ((mService.mSleeping || mService.mShuttingDown)               && mLastPausedActivity == next && next.state == ActivityState.PAUSED) {               ......           }              ......              // If we are currently pausing an activity, then don't do anything            // until that is done.            if (mPausingActivity != null) {               ......           }              ......              // We need to start pausing the current activity so the top one            // can be resumed...            if (mResumedActivity != null) {               ......               startPausingLocked(userLeaving, false);               return true;           }              ......       }          ......      }  

        函数先通过调用topRunningActivityLocked函数获得堆栈顶端的Activity,这里就是MainActivity了,这是在上面的Step 9设置好的,保存在next变量中。 

接下来把mUserLeaving的保存在本地变量userLeaving中,然后重新设置为false,在上面的Step 9中,mUserLeaving的值为true,因此,这里的userLeaving为true。

这里的mResumedActivity为Launcher,因为Launcher是当前正被执行的Activity。

当我们处理休眠状态时,mLastPausedActivity保存堆栈顶端的Activity,因为当前不是休眠状态,所以mLastPausedActivity为null。

有了这些信息之后,下面的语句就容易理解了:

   // If the top activity is the resumed one, nothing to do.       if (mResumedActivity == next && next.state == ActivityState.RESUMED) {   ......      }         // If we are sleeping, and there is no resumed activity, and the top       // activity is paused, well that is the state we want.       if ((mService.mSleeping || mService.mShuttingDown)   && mLastPausedActivity == next && next.state == ActivityState.PAUSED) {   ......      }  

        它首先看要启动的Activity是否就是当前处理Resumed状态的Activity,如果是的话,那就什么都不用做,直接返回就可以了;否则再看一下系统当前是否休眠状态,如果是的话,再看看要启动的Activity是否就是当前处于堆栈顶端的Activity,如果是的话,也是什么都不用做。

上面两个条件都不满足,因此,在继续往下执行之前,首先要把当处于Resumed状态的Activity推入Paused状态,然后才可以启动新的Activity。但是在将当前这个Resumed状态的Activity推入Paused状态之前,首先要看一下当前是否有Activity正在进入Pausing状态,如果有的话,当前这个Resumed状态的Activity就要稍后才能进入Paused状态了,这样就保证了所有需要进入Paused状态的Activity串行处理。

这里没有处于Pausing状态的Activity,即mPausingActivity为null,而且mResumedActivity也不为null,于是就调用startPausingLocked函数把Launcher推入Paused状态去了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwgxww.html