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

2024-05-26 21:08

本文主要是介绍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>() {@Overrideprotected 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.Stubimplements 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方法,源码如下:

    @Overridepublic 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 descriptorsif (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,即要打开的ActivityoutActivity[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) {// 调用startActivityUncheckedresult = 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) {// 判断是否有运行的Activityfinal ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);final boolean hasRunningActivity = next != null;...//取消初始化所有的ActivitymStackSupervisor.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;}// 暂停当前Activityboolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, false);if (mResumedActivity != null) {...pausing |= startPausingLocked(userLeaving, false, next, false);}...// 启动新的ActivitymStackSupervisor.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,暂停Activityprev.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) {// 获取activityActivityClientRecord 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 listenersArrayList<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);// 判断进程不为nullif (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方法,找到该方法,如下:

@Overridepublic 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 activityWindowManagerGlobal.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) {// 获取ActivityInfoActivityInfo aInfo = r.activityInfo;if (r.packageInfo == null) {r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,Context.CONTEXT_INCLUDE_CODE);}// 设置ComponentNameComponentName 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 {// 通过反射创建一个Activityjava.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 {// 创建ApplicationApplication 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的主题Themeactivity.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 considerationr = 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

这篇关于Framwork源码解析(5)—Activity启动流程(8.0)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005593

相关文章

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如