本文主要是介绍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相关联。找到ActivityStarter
的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 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栈的管理。内部管理了mHomeStack
、mFocusedStack
和mLastFocusedStack
三个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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!