Framwork源码解析(5)—Activity启动流程(8.0)

调用startActivity启动Activity流程

1、 调用启动方法;

Intent intent = new Intent();
intent.setClassName("packageName","className");
startActivity(intent);

2、进入Activity类的startActivity方法,

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

找到当前类的this.startActivity(intent, null);方法,不难发现,其实最终调用的都是startActivityForResult方法;

@Override
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);
    }
}

3、找到Activity类的startActivityForResult方法,最终调用了mInstrumentation的execStartActivity方法;

...
Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
...

4、点进去Instrumentation类,找到execStartActivity方法,省略前后代码,找到如下代码:

...
   int result = ActivityTaskManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
...

5、进入ActivityTaskManager类,找到getService方法,可以看到这个方法在10.0是隐藏方法,不能反射;

/** @hide */
public static IActivityTaskManager getService() {
    return IActivityTaskManagerSingleton.get();
}

这里找到IActivityTaskManagerSingleton的创建方法如下,可以看到是先通过ServiceManager.getService获取一个AMS的binder对象,然后调用IActivityManager.Stub.asInterface。这些操作的作用就是使用AIDL进行IPC(进程间通信)与AMS进行通信。

private static final Singleton<IActivityManager> IActivityManagerSingleton =
        new Singleton<IActivityManager>() {
            @Override
            protected IActivityManager create() {
            	// 通过ServiceManager来获取ACTIVITY_SERVICE类型的binder服务端代理对象,该对象可以调用binder服务端的方法,这里的binder服务端就是AMS的binder服务端
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                final IActivityManager am = IActivityManager.Stub.asInterface(b);
                return am;
            }
        };

我们知道AMS类继承IActivityManager…Stub类,所以上面返回的就是一个ActivityManagerService对象

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
        }

所以ActivityTaskManager.getService().startActivity调用的就是IActivityTaskManager.startActivity方法,下面就是去AMS中查找该方法。

ActivityManagerService(简称AMS)

ActivityManagerService简称AMS,不熟悉的建议先看一下AMS启动流程:https://blog.csdn.net/u010982507/article/details/108189647
找到AMS的startActivity(路径:/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java)方法,源码如下:
1、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 bOptions) {
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, bOptions,
            UserHandle.getCallingUserId());
}

2、startActivityAsUser
紧接着调用了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 bOptions, int userId) {
        enforceNotIsolatedCaller("startActivity");
        userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
                userId, false, ALLOW_FULL_ONLY, "startActivity", null);
        // TODO: Switch to user app stacks here.
        return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
                resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
                profilerInfo, null, null, bOptions, false, userId, null, null,
                "startActivityAsUser");
    }

3、startActivityMayWait
startActivityAsUser方法中调用了ActivtyStarter.startActivityMayWait方法,mActivityStarter是ActivityStarter的对象,ActivityStarter是Android 7.0新加入的类,它是加载Activity的控制类,会收集所有的逻辑来决定如何将Intent和Flags转换为Activity,并将Activity和Task以及Stack相关联。找到ActivityStarterstartActivityMayWait方法:

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 globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
            IActivityContainer iContainer, TaskRecord inTask, String reason) {
        // Refuse possible leaked file descriptors
        if (intent != null && intent.hasFileDescriptors()) {
            throw new IllegalArgumentException("File descriptors passed in Intent");
        }
        mSupervisor.mActivityMetricsLogger.notifyActivityLaunching();
        boolean componentSpecified = intent.getComponent() != null

   // 调用startActivityLocked方法
   int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType,
                    aInfo, rInfo, voiceSession, voiceInteractor,
                    resultTo, resultWho, requestCode, callingPid,
                    callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
                    options, ignoreTargetSecurity, componentSpecified, outRecord, container,
                    inTask, reason);
   ...

4、startActivityLocked

 int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
            String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
            String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
            TaskRecord inTask, String reason) {
		...
		 // 调用startActivity方法
        mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
                aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
                callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
                options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
                container, inTask);
		...
        return mLastStartActivityResult;
    }

5、startActivity

 private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
            String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
            String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
            ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
            ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
            TaskRecord inTask) {

	 // 记录一个要创建的Activity对象的所有信息
	 ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
                callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
                resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
                mSupervisor, container, options, sourceRecord);
	if (outActivity != null) {
			// 将信息传给outActivity,即要打开的Activity
	        outActivity[0] = r;
	}
	...
	// 调用startActivity方法
	 return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true,
                options, inTask, outActivity);
}

6、startActivity

    private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity) {
		// 调用startActivityUnchecked
		result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, outActivity);
        postStartActivityProcessing(r, result, mSupervisor.getLastStack().mStackId,  mSourceRecord,
                mTargetStack);

        return result;
    }

7、startActivityUnchecked

private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
            ActivityRecord[] outActivity) {
         // 调用ActivityStackSupervisor类的resumeFocusedStackTopActivityLocked方法
		 mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,
                        mOptions);
}

8、resumeFocusedStackTopActivityLocked
找到类ActivityStackSupervisor,位置:/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

 boolean resumeFocusedStackTopActivityLocked() {
        return resumeFocusedStackTopActivityLocked(null, null, null);
    }

boolean resumeFocusedStackTopActivityLocked(
        ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
    if (targetStack != null && isFocusedStack(targetStack)) {
    	// targetStack不为null,则调用ActivityStack类的resumeTopActivityUncheckedLocked方法
        return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
    }
    final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
    if (r == null || r.state != RESUMED) {
        mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
    } else if (r.state == RESUMED) {
        // Kick off any lingering app transitions form the MoveTaskToFront operation.
        mFocusedStack.executeAppTransition(targetOptions);
    }
    return false;
}

9、resumeTopActivityUncheckedLocked
找到ActivityStack(位置:/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java)类的resumeTopActivityUncheckedLocked方法:

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
    	...
		result = resumeTopActivityInnerLocked(prev, options);
		...
        return result;
    }

10、resumeTopActivityInnerLocked

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
	// 判断是否有运行的Activity
	final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
    final boolean hasRunningActivity = next != null;
	
	...
	//取消初始化所有的Activity
	mStackSupervisor.cancelInitializingActivities();	
	
	// 如果没有运行的activity,则寻找别的
	if (!hasRunningActivity) {
            // There are no activities left in the stack, let's look somewhere else.
            return resumeTopActivityInNextFocusableStack(prev, options, "noMoreActivities");
    }
	
	// 如果栈顶activity就是要启动的Activity,则什么都不做
	// If the top activity is the resumed one, nothing to do.
    if (mResumedActivity == next && next.state == ActivityState.RESUMED &&
                mStackSupervisor.allResumedActivitiesComplete()) {
        // Make sure we have executed any pending transitions, since there
        // should be nothing left to do at this point.
        executeAppTransition(options);
        if (DEBUG_STATES) Slog.d(TAG_STATES,
                "resumeTopActivityLocked: Top activity resumed " + next);
        if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
        return false;
    }
	// 暂停当前Activity
	 boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, false);
     if (mResumedActivity != null) {
         ...
         pausing |= startPausingLocked(userLeaving, false, next, false);
     }
     ...
     // 启动新的Activity
     mStackSupervisor.startSpecificActivityLocked(next, true, false);
	...

其实该方法中主要就是暂停旧的Activity和启动新的Activity。
10-1、startPausingLocked
暂停旧的Activity

 final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,
            ActivityRecord resuming, boolean pauseImmediately) {
  		...
        ActivityRecord prev = mResumedActivity;
		...
        
        if (prev.app != null && prev.app.thread != null) {
            try {
               ...
  				// 调用schedulePauseActivity,暂停Activity
                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
                        userLeaving, prev.configChangeFlags, pauseImmediately);
            } 
        } else {
            mPausingActivity = null;
            mLastPausedActivity = null;
            mLastNoHistoryActivity = null;
        }
		...

    }

10-1-2、schedulePauseActivity
找到ActivityRecord类(位置:/frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java),从ActivityRecord属性中可以得知prev.app就是运行的进程记录器ProcessRecord的对象,如下图所示:
在这里插入图片描述
prev.app.thread指的就是IApplicationThread类的对象(ProcessRecord类位置:/frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java),如下图所示:
在这里插入图片描述
也就是每个应用进程都有一个IApplicationThread。

这里阐述几个概念:
IApplicationThread:Binder进程通信,用来实现AMS和ActivityThread之间的交互。
查看ActivityThread源码,如下:

final ApplicationThread mAppThread = new ApplicationThread();

有个ApplicationThread内部类,找到该类,发现它是继承IApplicationThread.Stub类,

private class ApplicationThread extends IApplicationThread.Stub {}

这里就是Binder进程通信,用来实现AMS和ActivityThread之间的交互。

ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
ActivitySupervisor:管理 activity 任务栈
ActivityThread:ActivityThread 运行在UI线程(主线程),App的真正入口。ActivityThread就表示主线程。
ApplicationThread:继承IApplicationThread.Stub类,用来实现AMS和ActivityThread之间的交互。
ApplicationThreadProxy:ApplicationThread 在服务端的代理。AMS就是通过该代理与ActivityThread进行通信的。
IActivityManager:继承与IInterface接口,抽象出跨进程通信需要实现的功能
Instrumentation:仪表盘,负责调用Activity和Application生命周期。测试用到这个类比较多。
ActivityStackSupervisor:负责所有Activity栈的管理。内部管理了mHomeStackmFocusedStackmLastFocusedStack三个Activity栈。其中,mHomeStack管理的是Launcher相关的Activity栈;mFocusedStack管理的是当前显示在前台Activity的Activity栈;mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。

所以这里调用prev.app.thread.schedulePauseActivity就是调用的ApplicationThread类的schedulePauseActivity方法,可以发现参数是一一对应的,找到schedulePauseActivity源码:

 public final void schedulePauseActivity(IBinder token, boolean finished,
                boolean userLeaving, int configChanges, boolean dontReport) {
            int seq = getLifecycleSeq();
            if (DEBUG_ORDER) Slog.d(TAG, "pauseActivity " + ActivityThread.this
                    + " operation received seq: " + seq);
            // 发送消息
            sendMessage(
                    finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
                    token,
                    (userLeaving ? USER_LEAVING : 0) | (dontReport ? DONT_REPORT : 0),
                    configChanges,
                    seq);
        }

10-1-3、PAUSE_ACTIVITY
H类就是一个hander,源码如下:

 private class H extends Handler {}

找到handleMessage方法,如下

 public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                ...
                case PAUSE_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                    SomeArgs args = (SomeArgs) msg.obj;
                    // 调用handlePauseActivity方法
                    handlePauseActivity((IBinder) args.arg1, false,
                            (args.argi1 & USER_LEAVING) != 0, args.argi2,
                            (args.argi1 & DONT_REPORT) != 0, args.argi3);
                    maybeSnapshot();
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
                ...
 }

这里调用了handlePauseActivity方法,找到该方法,源码如下:

 private void handlePauseActivity(IBinder token, boolean finished,
            boolean userLeaving, int configChanges, boolean dontReport, int seq) {
        // 获取activity
        ActivityClientRecord r = mActivities.get(token);
       ...
        if (r != null) {
            ...
            // 主要调用了performPauseActivity方法
            performPauseActivity(token, finished, r.isPreHoneycomb(), "handlePauseActivity");
			...
        }
    }

performPauseActivity方法

 final Bundle performPauseActivity(ActivityClientRecord r, boolean finished,
            boolean saveState, String reason) {
       ...
       // 主要调用performPauseActivityIfNeeded方法
        performPauseActivityIfNeeded(r, reason);
        // Notify any outstanding on paused listeners
        ArrayList<OnActivityPausedListener> listeners;
        synchronized (mOnPauseListeners) {
            listeners = mOnPauseListeners.remove(r.activity);
        }
        int size = (listeners != null ? listeners.size() : 0);
        for (int i = 0; i < size; i++) {
        	// 调用onPaused监听
            listeners.get(i).onPaused(r.activity);
        }

        return !r.activity.mFinished && saveState ? r.state : null;
    }

performPauseActivityIfNeeded方法
该方法主要调用Instrumentation.callActivityOnPause方法,Instrumentation仪表盘,像一个管家负责调用Activity和Application生命周期。

private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) {
		...
        mInstrumentation.callActivityOnPause(r.activity);
        ...
    }

这里就回到最初的测试程序中的Instrumentation类了,找到callActivityOnPause方法,如下:

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

调用了Activity类的performPause方法,找到该方法,如下:

final void performPause() {
    // 分发Fragment的暂停方法
    mFragments.dispatchPause();
	//调用Activity的onPause方法
    onPause();
}

onPause
这里就触发了Activity的onPause生命周期方法。

@CallSuper
protected void onPause() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);
    getApplication().dispatchActivityPaused(this);
    mCalled = true;
}

10-2、startSpecificActivityLocked
上面说完了旧Activity的暂停,接着就是新Activity的启动。回顾下源码:

// 启动新的Activity
mStackSupervisor.startSpecificActivityLocked(next, true, false);

找到ActivityStackSupervisor类(位置:/frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java)的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.getStack().setLaunchTime(r);
		// 判断进程不为null
        if (app != null && app.thread != null) {
            try {
          		// 调用realStartActivityLocked方法
                realStartActivityLocked(r, app, andResume, checkConfig);
                return;
            }
        }
		//
        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                "activity", r.intent.getComponent(), false, false, true);
    }

这里判断当启动同一进程内的Activity的时候,则调用realStartActivityLocked方法:
realStartActivityLocked

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
    ...
	app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
	                    System.identityHashCode(r), r.info,
	                    // TODO: Have this take the merged configuration instead of separate global and
	                    // override configs.
	                    mergedConfiguration.getGlobalConfiguration(),
	                    mergedConfiguration.getOverrideConfiguration(), r.compat,
	                    r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
	                    r.persistentState, results, newIntents, !andResume,
	                    mService.isNextTransitionForward(), profilerInfo);
	...
}

在realStartActivityLocked方法中调用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);
			// 最后发送了LAUNCH_ACTIVITY消息
            sendMessage(H.LAUNCH_ACTIVITY, r);
        }

找到handleMessage方法下的LAUNCH_ACTIVITY消息,如下

 public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                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, "LAUNCH_ACTIVITY");
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
                ...
 }

又调用了handleLaunchActivity方法,源码如下:

 private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
			
        // Initialize before creating the activity
        WindowManagerGlobal.initialize();
		// 1.这个方法主要是attach()+oncre()+onstart()
        Activity a = performLaunchActivity(r, customIntent);

        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            reportSizeConfigurations(r);
            Bundle oldState = r.state;
            // 调用了handleResumeActivity方法
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
        ...
    }

performLaunchActivity(创建Activity)

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
		// 获取ActivityInfo
        ActivityInfo aInfo = r.activityInfo;
        if (r.packageInfo == null) {
            r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
                    Context.CONTEXT_INCLUDE_CODE);
        }
		// 设置ComponentName
        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上下文
        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;
        try {
        	// 通过反射创建一个Activity
            java.lang.ClassLoader cl = appContext.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);
            }
        } 
        ...
        try {
        	// 创建Application
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);
            if (activity != null) {
                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                Configuration config = new Configuration(mCompatConfiguration);
                if (r.overrideConfig != null) {
                    config.updateFrom(r.overrideConfig);
                }
              	
                Window window = null;
                if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
                    window = r.mPendingRemoveWindow;
                    r.mPendingRemoveWindow = null;
                    r.mPendingRemoveWindowManager = null;
                }
                appContext.setOuterContext(activity);
                // 调用attach()方法,创建PhoneWindow以及DectorView,mContentParent(就是咱们setContentView的布局)并给Activity的顶层传递UiThread 等
                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, window, r.configCallback);

                if (customIntent != null) {
                    activity.mIntent = customIntent;
                }
                r.lastNonConfigurationInstances = null;
                checkAndBlockForNetworkAccess();
                activity.mStartedActivity = false;
                int theme = r.activityInfo.getThemeResource();
                if (theme != 0) {
                	//设置Activity的主题Theme
                    activity.setTheme(theme);
                }

                activity.mCalled = false;
                if (r.isPersistable()) {
           			// 调用callActivityOnCreate方法
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
            r.paused = true;
            mActivities.put(r.token, r);

        return activity;
    }

mInstrumentation.callActivityOnCreate();
找到Instrumentation类的callActivityOnCreate方法,如下:

public void callActivityOnCreate(Activity activity, Bundle icicle) {
     prePerformCreate(activity);
     activity.performCreate(icicle);
     postPerformCreate(activity);
 }

找到Activity类的performCreate(icicle);方法,如下:

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

onCreate方法
这里就调用了Activity的onCreate生命周期方法,Activity就创建完成。

@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
	...
	getApplication().dispatchActivityCreated(this, savedInstanceState);
	...
}

getApplication().dispatchActivityCreated(this, savedInstanceState);Activity的每个生命周期调用的时候 ,将当前的activity传递给application,并调用的对应其生命周期的回调。所以实现只要实现Application的 registerActivityLifecycleCallbacks(ActivityLifecycleCallbackscallback)回调方法,可以监听每个加载进来的Activity 及其对应的生命周期。我们可以进行任务栈或者特殊功能的实现。

handleResumeActivity(显示Activity)

ActivityThread.handleResumeActivity()方法:主要是将DectotView放到Window里面去,通过RootViewImp进行onMeasure 、onlayout 、onDraw

final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
        ActivityClientRecord r = mActivities.get(token);
        if (!checkAndUpdateLifecycleSeq(seq, r, "resumeActivity")) {
            return;
        }

        // If we are getting ready to gc after going to the background, well
        // we are back active so skip it.
        unscheduleGcIdler();
        mSomeActivitiesChanged = true;

        // TODO Push resumeArgs into the activity for consideration
        r = performResumeActivity(token, clearHide, reason);

        if (r != null) {
            final Activity a = r.activity;

            final int forwardBit = isForward ?
                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;

            boolean willBeVisible = !a.mStartedActivity;
            if (!willBeVisible) {
                try {
                    willBeVisible = ActivityManager.getService().willActivityBeVisible(
                            a.getActivityToken());
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
            }
            //将DectorView添加进去PhoneWIndow  进行测量  布局  渲染 并展示出来
            if (r.window == null && !a.mFinished && willBeVisible) {
                r.window = r.activity.getWindow();
                View decor = r.window.getDecorView();
                decor.setVisibility(View.INVISIBLE);
                ViewManager wm = a.getWindowManager();
                WindowManager.LayoutParams l = r.window.getAttributes();
                a.mDecor = decor;
                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
                l.softInputMode |= forwardBit;
                if (r.mPreserveWindow) {
                    a.mWindowAdded = true;
                    r.mPreserveWindow = false;
                    ViewRootImpl impl = decor.getViewRootImpl();
                    if (impl != null) {
                        impl.notifyChildRebuilt();
                    }
                }
                if (a.mVisibleFromClient) {
                    if (!a.mWindowAdded) {
                        a.mWindowAdded = true;
                        wm.addView(decor, l);
                    } else {
                        // The activity will get a callback for this {@link LayoutParams} change
                        // earlier. However, at that time the decor will not be set (this is set
                        // in this method), so no action will be taken. This call ensures the
                        // callback occurs with the decor set.
                        a.onWindowAttributesChanged(l);
                    }
                }

            // If the window has already been added, but during resume
            // we started another activity, then don't yet make the
            // window visible.
            } else if (!willBeVisible) {
                if (localLOGV) Slog.v(
                    TAG, "Launch " + r + " mStartedActivity set");
                r.hideForNow = true;
            }

            // Get rid of anything left hanging around.
            cleanUpPendingRemoveWindows(r, false /* force */);

            // The window is now visible if it has been added, we are not
            // simply finishing, and we are not starting another activity.
            if (!r.activity.mFinished && willBeVisible
                    && r.activity.mDecor != null && !r.hideForNow) {
                if (r.newConfig != null) {
                    performConfigurationChangedForActivity(r, r.newConfig);
                    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity "
                            + r.activityInfo.name + " with newConfig " + r.activity.mCurrentConfig);
                    r.newConfig = null;
                }
                if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward="
                        + isForward);
                WindowManager.LayoutParams l = r.window.getAttributes();
                if ((l.softInputMode
                        & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
                        != forwardBit) {
                    l.softInputMode = (l.softInputMode
                            & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
                            | forwardBit;
                    if (r.activity.mVisibleFromClient) {
                        ViewManager wm = a.getWindowManager();
                        View decor = r.window.getDecorView();
                        wm.updateViewLayout(decor, l);
                    }
                }

                r.activity.mVisibleFromServer = true;
                mNumVisibleActivities++;
                if (r.activity.mVisibleFromClient) {
                    r.activity.makeVisible();
                }
            }
    }

public final ActivityClientRecord performResumeActivity(IBinder token,
            boolean clearHide, String reason) {
        ActivityClientRecord r = mActivities.get(token);
     
        if (r != null && !r.activity.mFinished) {
            	...
            	// 如果Activity存在,则调用performResume方法
                r.activity.performResume();
				...
        return r;
    }

到这Activity启动流程基本结束,最后盗张图镇楼:
在这里插入图片描述

学习参考:https://blog.csdn.net/lk2021991/article/details/89393077
https://www.jianshu.com/p/274ccb315a7a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ruiurrui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值