源码分析-Activity的启动流程

Posted yinianzhijian99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码分析-Activity的启动流程相关的知识,希望对你有一定的参考价值。

android 6.0源码为参考,其他版本api会稍有不同

在Activity中,启动一个Activity的方法

@Override
public void startActivity(Intent intent) 
    this.startActivity(intent, null);

调用其重载2个参数的方法

public void startActivity(Intent intent, @Nullable Bundle options) 
    if (options != null) 
        startActivityForResult(intent, -1, options);
     else 
        // Note we want to go through this call for compatibility with
        // applications that may have overridden the method.
        startActivityForResult(intent, -1);
    

startActivity()最终调用的也是startActivityForResult()方法

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
        @Nullable Bundle options) 
    if (mParent == null) 
        options = transferSpringboardActivityOptions(options);
        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(
                this, mMainThread.getApplicationThread(), mToken, this,
                intent, requestCode, options);
        if (ar != null) 
            mMainThread.sendActivityResult(
                mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                ar.getResultData());
        
        if (requestCode >= 0) 
            mStartedActivity = true;
        

        cancelInputsAndStartExitTransition(options);
        // TODO Consider clearing/flushing other event sources and events for child windows.
     else 
        if (options != null) 
            mParent.startActivityFromChild(this, intent, requestCode, options);
         else 
            // Note we want to go through this method for compatibility with
            // existing applications that may have overridden it.
            mParent.startActivityFromChild(this, intent, requestCode);
        
    

Instrumentation的execStartActivity()方法

public ActivityResult execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) 
    IApplicationThread whoThread = (IApplicationThread) contextThread;
    Uri referrer = target != null ? target.onProvideReferrer() : null;
    if (referrer != null) 
        intent.putExtra(Intent.EXTRA_REFERRER, referrer);
    
    if (mActivityMonitors != null) 
        synchronized (mSync) 
            final int N = mActivityMonitors.size();
            for (int i=0; i<N; i++) 
                final ActivityMonitor am = mActivityMonitors.get(i);
                if (am.match(who, null, intent)) 
                    am.mHits++;
                    if (am.isBlocking()) 
                        return requestCode >= 0 ? am.getResult() : null;
                    
                    break;
                
            
        
    
    try 
        intent.migrateExtraStreamToClipData();
        intent.prepareToLeaveProcess();
        int result = ActivityManagerNative.getDefault()
            .startActivity(whoThread, who.getBasePackageName(), intent,
                    intent.resolveTypeIfNeeded(who.getContentResolver()),
                    token, target != null ? target.mEmbeddedID : null,
                    requestCode, 0, null, options);
        checkStartActivityResult(result, intent);
     catch (RemoteException e) 
        throw new RuntimeException("Failure from system", e);
    
    return null;

ActivityManagerNative.getDefault().startActivity是进程间的通信,进入ActivityManagerService中的startActivity方法

@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle options) 
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
        resultWho, requestCode, startFlags, profilerInfo, options,
        UserHandle.getCallingUserId());

调用startActivityAsUser()方法

@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle options, int userId) 
    enforceNotIsolatedCaller("startActivity");
    userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
            false, ALLOW_FULL_ONLY, "startActivity", null);
    // TODO: Switch to user app stacks here.
    return mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent,
            resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
            profilerInfo, null, null, options, false, userId, null, null);

进入ActivityStackSupervisor的startActivityMayWait()方法

final int startActivityMayWait(IApplicationThread caller, int callingUid,
        String callingPackage, Intent intent, String resolvedType,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode, int startFlags,
        ProfilerInfo profilerInfo, WaitResult outResult, Configuration config,
        Bundle options, boolean ignoreTargetSecurity, int userId,
        IActivityContainer iContainer, TaskRecord inTask) 
    // Refuse possible leaked file descriptors
    if (intent != null && intent.hasFileDescriptors()) 
        throw new IllegalArgumentException("File descriptors passed in Intent");
    
    boolean componentSpecified = intent.getComponent() != null;

    //...

        int res = startActivityLocked(caller, intent, resolvedType, aInfo,
                voiceSession, voiceInteractor, resultTo, resultWho,
                requestCode, callingPid, callingUid, callingPackage,
                realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity,
                componentSpecified, null, container, inTask);
                
      //...

        return res;
    

进入startActivityLocked方法

final int startActivityLocked(IApplicationThread caller,
        Intent intent, String resolvedType, ActivityInfo aInfo,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode,
        int callingPid, int callingUid, String callingPackage,
        int realCallingPid, int realCallingUid, int startFlags, Bundle options,
        boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,
        ActivityContainer container, TaskRecord inTask) 
    int err = ActivityManager.START_SUCCESS;

    ProcessRecord callerApp = null;
    
    abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
            callingPid, resolvedType, aInfo.applicationInfo);

    doPendingActivityLaunchesLocked(false);

    err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor,
            startFlags, true, options, inTask);

    if (err < 0) 
        // If someone asked to have the keyguard dismissed on the next
        // activity start, but we are not actually doing an activity
        // switch...  just dismiss the keyguard now, because we
        // probably want to see whatever is behind it.
        notifyActivityDrawnForKeyguard();
    
    return err;

进入startActivityUncheckedLocked方法

final int startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags,
        boolean doResume, Bundle options, TaskRecord inTask) 
    final Intent intent = r.intent;
    final int callingUid = r.launchedFromUid;

    ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
    targetStack.mLastPausedActivity = null;
    targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
    if (!launchTaskBehind) 
        // Don't set focus on an activity that's going to the back.
        mService.setFocusedActivityLocked(r, "startedActivity");
    
    return ActivityManager.START_SUCCESS;

targetStack是ActivityStack(activity栈),进入startActivityLocked()方法,

final void startActivityLocked(ActivityRecord r, boolean newTask,
        boolean doResume, boolean keepCurTransition, Bundle options) 
    TaskRecord rTask = r.task;
    final int taskId = rTask.taskId;
    
    //...
    if (doResume) 
        mStackSupervisor.resumeTopActivitiesLocked(this, r, options);
    

进入ActivityStackSupervisor的resumeTopActivitiesLocked方法

boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
        Bundle targetOptions) 
    if (targetStack == null) 
        targetStack = mFocusedStack;
    
    // Do targetStack first.
    boolean result = false;
    if (isFrontStack(targetStack)) 
        result = targetStack.resumeTopActivityLocked(target, targetOptions);
    

    for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) 
        final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) 
            final ActivityStack stack = stacks.get(stackNdx);
            if (stack == targetStack) 
                // Already started above.
                continue;
            
            if (isFrontStack(stack)) 
                stack.resumeTopActivityLocked(null);
            
        
    
    return result;

进入ActivityStack的resumeTopActivityLocked方法

final boolean resumeTopActivityLocked(ActivityRecord prev) 
    return resumeTopActivityLocked(prev, null);


final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) 
    if (mStackSupervisor.inResumeTopActivity) 
        // Don't even start recursing.
        return false;
    

    boolean result = false;
    try 
        // Protect against recursion.
        mStackSupervisor.inResumeTopActivity = true;
        if (mService.mLockScreenShown == ActivityManagerService.LOCK_SCREEN_LEAVING) 
            mService.mLockScreenShown = ActivityManagerService.LOCK_SCREEN_HIDDEN;
            mService.updateSleepIfNeededLocked();
        
        result = resumeTopActivityInnerLocked(prev, options);
     finally 
        mStackSupervisor.inResumeTopActivity = false;
    
    return result;

进入resumeTopActivityInnerLocked()方法

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, Bundle options) 
    
    //...
    
    boolean dontWaitForPause = (next.info.flags&ActivityInfo.FLAG_RESUME_WHILE_PAUSING) != 0;
    boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, true, dontWaitForPause);
    if (mResumedActivity != null) 
        if (DEBUG_STATES) Slog.d(TAG_STATES,
                "resumeTopActivityLocked: Pausing " + mResumedActivity);
        pausing |= startPausingLocked(userLeaving, false, true, dontWaitForPause);
    
    if (pausing) 
        if (DEBUG_SWITCH || DEBUG_STATES) Slog.v(TAG_STATES,
                "resumeTopActivityLocked: Skip resume: need to start pausing");
        if (next.app != null && next.app.thread != null) 
            mService.updateLruProcessLocked(next.app, true, null);
        
        if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
        return true;
    
    
    if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Restarting " + next);
    mStackSupervisor.startSpecificActivityLocked(next, true, true);

    if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
    return true;

进入startPausingLocked方法

final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, boolean resuming,
        boolean dontWait) 
    
    ActivityRecord prev = mResumedActivity;
    if (prev.app != null && prev.app.thread != null) 
        if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev);
        try 
            EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
                    prev.userId, System.identityHashCode(prev),
                    prev.shortComponentName);
            mService.updateUsageStats(prev, false);
            prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
                    userLeaving, prev.configChangeFlags, dontWait);
         catch (Exception e) 
            // Ignore exception, if process died other code will cleanup.
            Slog.w(TAG, "Exception thrown during pause", e);
            mPausingActivity = null;
            mLastPausedActivity = null;
            mLastNoHistoryActivity = null;
        
     else 
        mPausingActivity = null;
        mLastPausedActivity = null;
        mLastNoHistoryActivity = null;
    

prev.app.thread为ApplicationThread对象实例,ApplicationThread是ActivityThread的内部类,进入schedulePauseActivity方法

public final void schedulePauseActivity(IBinder token, boolean finished,
        boolean userLeaving, int configChanges, boolean dontReport) 
    sendMessage(
            finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
            token,
            (userLeaving ? 1 : 0) | (dontReport ? 2 : 0),
            configChanges);

通过mH.sendMessage(msg)方法,进入handlePauseActivity

case PAUSE_ACTIVITY:
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
    handlePauseActivity((IBinder)msg.obj, false, (msg.arg1&1) != 0, msg.arg2,
            (msg.arg1&2) != 0);
    maybeSnapshot();
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    break;
private void handlePauseActivity(IBinder token, boolean finished,
        boolean userLeaving, int configChanges, boolean dontReport) 
    ActivityClientRecord r = mActivities.get(token);
    if (r != null) 
        //Slog.v(TAG, "userLeaving=" + userLeaving + " handling pause of " + r);
        if (userLeaving) 
            performUserLeavingActivity(r);
        

        r.activity.mConfigChangeFlags |= configChanges;
        performPauseActivity(token, finished, r.isPreHoneycomb());

        // Make sure any pending writes are now committed.
        if (r.isPreHoneycomb()) 
            QueuedWork.waitToFinish();
        

        // Tell the activity manager we have paused.
        if (!dontReport) 
            try 
                ActivityManagerNative.getDefault().activityPaused(token);
             catch (RemoteException ex) 
            
        
        mSomeActivitiesChanged = true;
    


final Bundle performPauseActivity(ActivityClientRecord r, boolean finished,
        boolean saveState) 
    
    try 
        // Next have the activity save its current state and managed dialogs...
        if (!r.activity.mFinished && saveState) 
            callCallActivityOnSaveInstanceState(r);
        
        // Now we are idle.
        r.activity.mCalled = false;
        mInstrumentation.callActivityOnPause(r.activity);
        EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(),
                r.activity.getComponentName().getClassName());
        if (!r.activity.mCalled) 
            throw new SuperNotCalledException(
                "Activity " + r.intent.getComponent().toShortString() +
                " did not call through to super.onPause()");
        

     catch (SuperNotCalledException e) 
        throw e;

     catch (Exception e) 
        //...
    
    r.paused = true;

进入Instrumentation的callActivityOnPause()方法

public void callActivityOnPause(Activity activity) 
    activity.performPause();

进入Activity的performPause()方法

final void performPause() 
    mDoReportFullyDrawn = false;
    mFragments.dispatchPause();
    mCalled = false;
    onPause();
    mResumed = false;
    if (!mCalled && getApplicationInfo().targetSdkVersion
            >= android.os.Build.VERSION_CODES.GINGERBREAD) 
        throw new SuperNotCalledException(
                "Activity " + mComponent.toShortString() +
                " did not call through to super.onPause()");
    
    mResumed = false;

Activity的 onPause(),也就是先暂停栈顶的activity实例

回到ApplicationThread的handlePauseActivity()方法中,performPauseActivity(token, finished, r.isPreHoneycomb())执行完后,执行

ActivityManagerNative.getDefault().activityPaused(token);

接着进入ActivityManagerService中的.activityPaused(token)方法

@Override
public final void activityPaused(IBinder token) 
    final long origId = Binder.clearCallingIdentity();
    synchronized(this) 
        ActivityStack stack = ActivityRecord.getStackLocked(token);
        if (stack != null) 
            stack.activityPausedLocked(token, false);
        
    
    Binder.restoreCallingIdentity(origId);

进入ActivityStack中的activityPausedLocked()方法

final void activityPausedLocked(IBinder token, boolean timeout) 
    if (DEBUG_PAUSE) Slog.v(TAG_PAUSE,
        "Activity paused: token=" + token + ", timeout=" + timeout);

    final ActivityRecord r = isInStackLocked(token);
    if (r != null) 
        mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
        if (mPausingActivity == r) 
            if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSED: " + r
                    + (timeout ? " (due to timeout)" : " (pause complete)"));
            completePauseLocked(true);
         else 
            EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
                    r.userId, System.identityHashCode(r), r.shortComponentName,
                    mPausingActivity != null
                        ? mPausingActivity.shortComponentName : "(none)");
            if (r.finishing && r.state == ActivityState.PAUSING) 
                if (DEBUG_PAUSE) Slog.v(TAG,
                        "Executing finish of failed to pause activity: " + r);
                finishCurrentActivityLocked(r, FINISH_AFTER_VISIBLE, false);
            
        
    


final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, int mode, boolean oomAdj) 
    //...
    mStackSupervisor.mFinishingActivities.add(r);
    r.resumeKeyDispatchingLocked();
    mStackSupervisor.getFocusedStack().resumeTopActivityLocked(null);
    return r;

进入ActivityStackSupervisor中的resumeTopActivityLocked(),再次进入resumeTopActivityInnerLocked方法,执行到最后几行

mStackSupervisor.startSpecificActivityLocked(next, true, true);

进入ActivityStackSupervisor中的startSpecificActivityLocked()方法

void startSpecificActivityLocked(ActivityRecord r,
        boolean andResume, boolean checkConfig) 
    // Is this activity's application already running?
    ProcessRecord app = mService.getProcessRecordLocked(r.processName,
            r.info.applicationInfo.uid, true);

    r.task.stack.setLaunchTime(r);

    if (app != null && app.thread != null) 
        try 
            if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
                    || !"android".equals(r.info.packageName)) 
                // Don't add this if it is a platform component that is marked
                // to run in multiple processes, because this is actually
                // part of the framework so doesn't make sense to track as a
                // separate apk in the process.
                app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
                        mService.mProcessStats);
            
            realStartActivityLocked(r, app, andResume, checkConfig);
            return;
         catch (RemoteException e) 
            Slog.w(TAG, "Exception when starting activity "
                    + r.intent.getComponent().flattenToShortString(), e);
        

        // If a dead object exception was thrown -- fall through to
        // restart the application.
    

    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
            "activity", r.intent.getComponent(), false, false, true);

进入realStartActivityLocked,启动待启动的activity

final boolean realStartActivityLocked(ActivityRecord r,
        ProcessRecord app, boolean andResume, boolean checkConfig)
        throws RemoteException 

        app.forceProcessStateUpTo(mService.mTopProcessState);
        app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
                new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,
                task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
                newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);

    return true;

进入ApplicationThread中的scheduleLaunchActivity()方法

@Override
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
        ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
        CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
        int procState, Bundle state, PersistableBundle persistentState,
        List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
        boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) 

    updateProcessState(procState, false);

    ActivityClientRecord r = new ActivityClientRecord();

    r.token = token;
    r.ident = ident;
    r.intent = intent;
    r.referrer = referrer;
    r.voiceInteractor = voiceInteractor;
    r.activityInfo = info;
    r.compatInfo = compatInfo;
    r.state = state;
    r.persistentState = persistentState;

    r.pendingResults = pendingResults;
    r.pendingIntents = pendingNewIntents;

    r.startsNotResumed = notResumed;
    r.isForward = isForward;

    r.profilerInfo = profilerInfo;

    r.overrideConfig = overrideConfig;
    updatePendingConfiguration(curConfig);

    sendMessage(H.LAUNCH_ACTIVITY, r);

通过mH.sendMessage(msg),执行handleLaunchActivity

case LAUNCH_ACTIVITY: 
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

    r.packageInfo = getPackageInfoNoCheck(
            r.activityInfo.applicationInfo, r.compatInfo);
    handleLaunchActivity(r, null);
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) 
    // If we are getting ready to gc after going to the background, well
    // we are back active so skip it.
    unscheduleGcIdler();
    mSomeActivitiesChanged = true;

    if (r.profilerInfo != null) 
        mProfiler.setProfiler(r.profilerInfo);
        mProfiler.startProfiling();
    

    // Make sure we are running with the most recent config.
    handleConfigurationChanged(null, null);

    if (localLOGV) Slog.v(
        TAG, "Handling launch of " + r);

    // Initialize before creating the activity
    WindowManagerGlobal.initialize();

    Activity a = performLaunchActivity(r, customIntent);

    if (a != null) 
        r.createdConfig = new Configuration(mConfiguration);
        Bundle oldState = r.state;
        handleResumeActivity(r.token, false, r.isForward,
                !r.activity.mFinished && !r.startsNotResumed);

        if (!r.activity.mFinished && r.startsNotResumed) 
            try 
                r.activity.mCalled = false;
                mInstrumentation.callActivityOnPause(r.activity);
                if (r.isPreHoneycomb()) 
                    r.state = oldState;
                
                if (!r.activity.mCalled) 
                    throw new SuperNotCalledException(
                        "Activity " + r.intent.getComponent().toShortString() +
                        " did not call through to super.onPause()");
                

             catch (SuperNotCalledException e) 
                throw e;

             catch (Exception e) 
                if (!mInstrumentation.onException(r.activity, e)) 
                    throw new RuntimeException(
                            "Unable to pause activity "
                            + r.intent.getComponent().toShortString()
                            + ": " + e.toString(), e);
                
            
            r.paused = true;
        
     else 
        // If there was an error, for any reason, tell the activity
        // manager to stop us.
        try 
            ActivityManagerNative.getDefault()
                .finishActivity(r.token, Activity.RESULT_CANCELED, null, false);
         catch (RemoteException ex) 
            // Ignore
        
    

进入performLaunchActivity

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) 
    // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");

    ActivityInfo aInfo = r.activityInfo;
    if (r.packageInfo == null) 
        r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                Context.CONTEXT_INCLUDE_CODE);
    

    ComponentName component = r.intent.getComponent();
    if (component == null) 
        component = r.intent.resolveActivity(
            mInitialApplication.getPackageManager());
        r.intent.setComponent(component);
    

    if (r.activityInfo.targetActivity != null) 
        component = new ComponentName(r.activityInfo.packageName,
                r.activityInfo.targetActivity);
    

    Activity activity = null;
    try 
        java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        r.intent.prepareToEnterProcess();
        if (r.state != null) 
            r.state.setClassLoader(cl);
        
     catch (Exception e) 
        if (!mInstrumentation.onException(activity, e)) 
            throw new RuntimeException(
                "Unable to instantiate activity " + component
                + ": " + e.toString(), e);
        
    

    try 
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);

        if (localLOGV) Slog.v(TAG, "Performing launch of " + r);
        if (localLOGV) Slog.v(
                TAG, r + ": app=" + app
                + ", appName=" + app.getPackageName()
                + ", pkg=" + r.packageInfo.getPackageName()
                + ", comp=" + r.intent.getComponent().toShortString()
                + ", dir=" + r.packageInfo.getAppDir());

        if (activity != null) 
            Context appContext = createBaseContextForActivity(r, activity);
            CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
            Configuration config = new Configuration(mCompatConfiguration);
            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
                    + r.activityInfo.name + " with config " + config);
            activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config,
                    r.referrer, r.voiceInteractor);

            if (customIntent != null) 
                activity.mIntent = customIntent;
            
            r.lastNonConfigurationInstances = null;
            activity.mStartedActivity = false;
            int theme = r.activityInfo.getThemeResource();
            if (theme != 0) 
                activity.setTheme(theme);
            

            activity.mCalled = false;
            if (r.isPersistable()) 
                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
             else 
                mInstrumentation.callActivityOnCreate(activity, r.state);
            
            if (!activity.mCalled) 
                throw new SuperNotCalledException(
                    "Activity " + r.intent.getComponent().toShortString() +
                    " did not call through to super.onCreate()");
            
            r.activity = activity;
            r.stopped = true;
            if (!r.activity.mFinished) 
                activity.performStart();
                r.stopped = false;
            
            if (!r.activity.mFinished) 
                if (r.isPersistable()) 
                    if (r.state != null || r.persistentState != null) 
                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                                r.persistentState);
                    
                 else if (r.state != null) 
                    mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                
            
            if (!r.activity.mFinished) 
                activity.mCalled = false;
                if (r.isPersistable()) 
                    mInstrumentation.callActivityOnPostCreate(activity, r.state,
                            r.persistentState);
                 else 
                    mInstrumentation.callActivityOnPostCreate(activity, r.state);
                
                if (!activity.mCalled) 
                    throw new SuperNotCalledException(
                        "Activity " + r.intent.getComponent().toShortString() +
                        " did not call through to super.onPostCreate()");
                
            
        
        r.paused = true;

        mActivities.put(r.token, r);

     catch (SuperNotCalledException e) 
        throw e;

     catch (Exception e) 
        if (!mInstrumentation.onException(activity, e)) 
            throw new RuntimeException(
                "Unable to start activity " + component
                + ": " + e.toString(), e);
        
    

    return activity;

进入mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);

public void callActivityOnCreate(Activity activity, Bundle icicle,
        PersistableBundle persistentState) 
    prePerformCreate(activity);
    activity.performCreate(icicle, persistentState);
    postPerformCreate(activity);

进入Activity中的performCreate

final void performCreate(Bundle icicle) 
    onCreate(icicle);
    mActivityTransitionState.readState(icicle);
    performCreateCommon();

执行onCreate(icicle); 即启动新的Activity

至此,整个启动流程结束。

整个流程的跳转调用很复杂,可能要花好几天才能梳理清楚。刚开始看源码时,可以只看大致流程,看方法的名字猜它的功能,看不懂直接跳过,不然真的就石沉大海了。

以上是关于源码分析-Activity的启动流程的主要内容,如果未能解决你的问题,请参考以下文章

源码分析-Activity的启动流程

基于android10.0源码分析Activity的启动流程

基于android10.0源码分析Activity的启动流程

Android 启动过程Activity 启动源码分析 ( ActivityThread 流程分析 一 )

Activity启动过程——10.0源码分析

Activity启动过程——10.0源码分析