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

 Step 9. ActivityStack.startActivityUncheckedLocked

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

public class ActivityStack {          ......          final int startActivityUncheckedLocked(ActivityRecord r,           ActivityRecord sourceRecord, Uri[] grantedUriPermissions,           int grantedMode, boolean onlyIfNeeded, boolean doResume) {           final Intent intent = r.intent;           final int callingUid = r.launchedFromUid;              int launchFlags = intent.getFlags();              // We'll invoke onUserLeaving before onPause only if the launching            // activity did not explicitly state that this is an automated launch.            mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;                      ......              ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP)               != 0 ? r : null;              // If the onlyIfNeeded flag is set, then we can do this if the activity            // being launched is the same as the one making the call...  or, as            // a special case, if we do not know the caller then we count the            // current top activity as the caller.            if (onlyIfNeeded) {               ......           }              if (sourceRecord == null) {               ......           } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {               ......           } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE               || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {               ......           }              if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {               ......           }              boolean addingToTask = false;           if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&               (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)               || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK               || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {                   // If bring to front is requested, and no result is requested, and                    // we can find a task that was started with this same                    // component, then instead of launching bring that one to the front.                    if (r.resultTo == null) {                       // See if there is a task to bring to the front.  If this is                        // a SINGLE_INSTANCE activity, there can be one and only one                        // instance of it in the history, and it is always in its own                        // unique task, so we do a special search.                        ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE                           ? findTaskLocked(intent, r.info)                           : findActivityLocked(intent, r.info);                       if (taskTop != null) {                           ......                       }                   }           }              ......              if (r.packageName != null) {               // If the activity being launched is the same as the one currently                // at the top, then we need to check if it should only be launched                // once.                ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);               if (top != null && r.resultTo == null) {                   if (top.realActivity.equals(r.realActivity)) {                       ......                   }               }              } else {               ......           }              boolean newTask = false;              // Should this be considered a new task?            if (r.resultTo == null && !addingToTask               && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {                   // todo: should do better management of integers.                    mService.mCurTask++;                   if (mService.mCurTask <= 0) {                       mService.mCurTask = 1;                   }                   r.task = new TaskRecord(mService.mCurTask, r.info, intent,                       (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0);                   ......                   newTask = true;                   if (mMainStack) {                       mService.addRecentTaskLocked(r.task);                   }              } else if (sourceRecord != null) {               ......           } else {               ......           }              ......              startActivityLocked(r, newTask, doResume);           return START_SUCCESS;       }          ......      }  

        函数首先获得intent的标志值,保存在launchFlags变量中。

这个intent的标志值的位Intent.FLAG_ACTIVITY_NO_USER_ACTION没有置位,因此 ,成员变量mUserLeaving的值为true。

这个intent的标志值的位Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP也没有置位,因此,变量notTop的值为null。

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

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