关于android:Android中Activity的工作过程二

49次阅读

共计 3139 个字符,预计需要花费 8 分钟才能阅读完成。

PS:本文系转载文章,浏览原文可读性会更好,文章开端有原文链接

本篇文章是基于 Android 中 Activity 的工作过程(一)来持续写的,在 Android 中 Activity 的工作过程(一)这篇文章中,咱们有讲到两行代码,那就是如下代码;

这里的 this 是指 MainActivity 对象,咱们在 Android 中 Activity 的工作过程(一)这篇文章中剖析了 MainActivity 的 onPause 的调用流程,本篇文章打算从以上两行代码剖析 Main2Activity 的 onCreate 和 onStart 调用流程。在 Android 中 Activity 的工作过程(一)这篇文章中,咱们有剖析到如下几行代码;

看正文 15,调用了 ActivityStack 的 resumeTopActivityInner-Locked(ActivityRecord prev, ActivityOptions options) 办法;

看正文 27 和 28 的代码,mStackSupervisor 是 ActivityStackSupervi-sor 类型的对象,都调用的是 ActivityStackSupervisor 的 startSpecificActivityLocked(ActivityR-ecord r,boolean andResume, boolean checkConfig) 办法;下面的两行代码:Intent intent = new Intent(this,Main2Activity.class); startActivity(intent); 咱们要启动的是 Main2Activity 对不对?那么 ActivityStackSupervisor 的 startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) 办法就是 Main2Activity 的 onCreate 和 onSt-art 办法的入口,好,咱们回到正文 27 和 28 的代码,咱们到底调用的是正文 27 的代码还是正文 28 的代码呢?咱们看一下正文 26 代码这个 if 语句的用意,它示意的是判断新的 app 过程是否被创立;首先我写这个 demo 启动 Main2Activity 的时候并没有启动一个新的过程哦,所以不会走正文 26 的 if 包裹的代码,所以会执行正文 28 的代码,咱们看一下 ActivityStackSupervisor 的 startSpecificActivityLocked(ActivityR-ecord r,boolean andResume, boolean checkConfig) 办法;

看正文 29,调用了 ActivityStackSupervisor 的 realStartActivi-tyLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) 办法;

看正文 30,app.thread 是 ActivityThread 的外部类 ApplicationThread,而后调用了 ApplicationThread 的 schedule-LaunchActivity(Intent intent, IBinder token, int ident,ActivityInfo info, Configuration curConfig, Configuration overrideConfig,Co-mpatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,int procState, Bundle state, PersistableBundle persistentState,List<ResultInfo> pendingResults, List<ReferrerI-ntent> pendingNewIntents,boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) 办法;

看正文 31,这里就插入一条 what 等于 H.LAUNCH_ACTIVITY 的音讯,而后 ActivityThread 的外部类 H 就会相应的做解决;

看正文 32,又调用了 ActivityThread 的 handleLaunchActivity(Activ-ityClientRecord r, Intent customIntent, String reason) 办法;

看正文 33,这里就调用了 ActivityThread 的 performLaunch-Activity(ActivityClientRecord r, Intent customIntent) 办法;private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {…… try { …… if (activity != null) {…… if (r.isPersistable()) {//35、mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else {//36、mInstrumentation.callActivityOnCreate(activity, r.state); } …… if (!r.activity.mFinished) {//37、activity.performStart(); r.stopped = false; } …… } …… } catch (SuperNotCalledException e) {……} catch (Exception e) {……} return activity; } 看正文 35,这里的 r.isPersistable() 就为 true,所以执行的是正文 35 处的代码,mInstrumentation 是 Instrumentation 类型的对象,所以调用了 Instrumentation 的 callActivityOnCreate(Activity activity, Bundle icicle,PersistableBundle persistentState) 办法;

看正文 38,这里调用了 Activity 的 performCreate(Bundle icicle, PersistableBundle persistentState) 办法,咱们往下看;

看正文 39,这里又调用了 Activity 的 onCreate(@Nullable Bundle savedInstanceState,@Nullable PersistableBundle persistentState) 办法;

看到正文 40 了没有,这里调用了 Activity 的 onCreate(Bundle savedInstanceState) 办法,所以 Activity 的 onCreate 流程咱们理分明了;好,咱们当初回看到正文 37 的代码,这里就调用了 Activity 的 performStart 办法,咱们往下看;

看正文 41,mInstrumentation 是 Instrumentation 类型的对象,这里就调用了 Instrumentation 的 callActivityOnStart(Activity activity) 办法;

看到正文 42 的代码没有,这里就调用到了 Activity 的 onStart 办法,所以 Activity 的 onStart 流程也理分明了。

正文完
 0