Android中Activity的工作过程(二)

PS:本文系转载文章,阅读原文可读性会更好,文章末尾有原文链接

本篇文章是基于Android中Activity的工作过程(一)来继续写的,在Android中Activity的工作过程(一)这篇文章中,我们有讲到两行代码,那就是如下代码;
图片
这里的 this 是指 MainActivity 对象,我们在Android中Activity的工作过程(一)这篇文章中分析了 MainActivity 的 onPause 的调用流程,本篇文章打算从以上两行代码分析 Main2Activity 的 onCreate 和 onStart 调用流程。在Android中Activity的工作过程(一)这篇文章中,我们有分析到如下几行代码;
图片
看注释15,调用了 ActivityStack 的 resumeTopActivityInner-Locked(ActivityRecord prev, ActivityOptions options) 方法;
Android中Activity的工作过程(二)_第1张图片
看注释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) 方法;
Android中Activity的工作过程(二)_第2张图片
看注释29,调用了 ActivityStackSupervisor 的 realStartActivi-tyLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) 方法;
Android中Activity的工作过程(二)_第3张图片
看注释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 pendingResults, List pendingNewIntents,boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) 方法;
Android中Activity的工作过程(二)_第4张图片
看注释31,这里就插入一条 what 等于 H.LAUNCH_ACTIVITY 的消息,然后 ActivityThread 的内部类 H 就会相应的做处理; 
Android中Activity的工作过程(二)_第5张图片
看注释32,又调用了 ActivityThread 的 handleLaunchActivity(Activ-ityClientRecord r, Intent customIntent, String reason) 方法;
Android中Activity的工作过程(二)_第6张图片
看注释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) 方法;
Android中Activity的工作过程(二)_第7张图片
看注释38,这里调用了 Activity 的 performCreate(Bundle icicle, PersistableBundle persistentState) 方法,我们往下看;
Android中Activity的工作过程(二)_第8张图片
看注释39,这里又调用了 Activity 的 onCreate(@Nullable Bundle savedInstanceState,@Nullable PersistableBundle persistentState) 方法;
Android中Activity的工作过程(二)_第9张图片
看到注释40了没有,这里调用了 Activity 的 onCreate(Bundle savedInstanceState) 方法,所以 Activity 的 onCreate 流程我们理清楚了;好,我们现在回看到注释37的代码,这里就调用了 Activity 的 performStart 方法,我们往下看;
Android中Activity的工作过程(二)_第10张图片
看注释41,mInstrumentation 是 Instrumentation 类型的对象,这里就调用了 Instrumentation 的 callActivityOnStart(Activity activity) 方法;
Android中Activity的工作过程(二)_第11张图片
看到注释42的代码没有,这里就调用到了 Activity 的 onStart 方法,所以 Activity 的 onStart 流程也理清楚了。

你可能感兴趣的:(androidjava)