美文网首页不重要的笔记
Activity生命周期流程简单记录

Activity生命周期流程简单记录

作者: 草貌路飞 | 来源:发表于2017-05-23 00:16 被阅读331次

    说到Activity生命周期是不是觉得很简单,在各个生命周期方法中打下log不就知道执行的流程了。但是还是想知道这些生命周期方法是在哪儿,被谁调用的。So...<br />
    这里我们接着上篇文章Activity启动过程简单记录写,因为里面记录了从startActivity开始,AMS首先会执行当前正在显示的Activity的pause流程,然后创建应用进程直到调用应用进程ApplicationThread的scheduleLaunchActivity执行真正的Activity的创建和显示。所以这里就从scheduleLaunchActivity方法开始记录整个流程。<br />
    --数字 代表当前方法调用下一方法的代码行号

    • ApplicationThread.scheduleLaunchActivity() AMS通过binder调用应用进程(ApplicationThread就是AMS用来和应用进程通信的接口),实际上最终想要调用的是ActivityThread中的方法(通过Handler对象mH). ApplicationThread中所有schedule***的方法最终都是在ActivityThread中对应的handle***方法中执行。如这里调用的就是handleLaunchActivity方法。
      • ActivityThread.handleLaunchActivity()
        • ActivityThread.performLaunchActivity()
          • Instrumentation.newActivity()
          • Activity.attach() 第一个生命周期方法
          • Instrumentation.callActivityOnCreate()
            • Activity.performCreate()
              • Activity.onCreate() 第二个
          • Activity.performStart()
            • Instrumentation.callActivityOnStart()
              • Activity.onStart() 第三
          • Instrumentation.callActivityOnPostCreate()
            • Activity.onPostCreate() 第四
        • 到这performLaunchActivity方法执行完成,回到handleLaunchActivity方法
        • ActivityThread.handleResumeActivity()
          • ActivityThread.performResumeActivity()
            • Activity.performResume()
              • Instrumentation.callActivityOnResume()
                • Activity.onResume()
              • Activity.onPostResume()
          • 到这performResumeActivity执行完成,回到handleResumeActivity方法
          • 接着会调用Activity的makeVisible方法,把decor添加到WindowManager显示,这里不深入
          • 接着执行Looper.myQueue().addIdleHandler(new Idler()),这个Idler会在主线程MessageQueue空闲时(比如说界面已经显示完成)执行,这个Idler过会儿会用到
          • 最后执行ActivityManagerNative.getDefault().activityResumed()告诉AMS启动完成。其中AMS也只是通知activity所在的ActivityStack这个activity已经resumed,其它什么都没做。
    • 这里开始时比较奇怪,还以为执行上一次显示的activity的stop流程会在这里开始,但是并没有。回到刚才提到的Idler中,这时界面已经显示完毕了。
    • ActivityThread.Idler.queueIdle()

    IActivityManager am = ActivityManagerNative.getDefault();
    if (a.activity != null && !a.activity.mFinished) {
    am.activityIdle(a.token, a.createdConfig, stopProfiling);
    }
    可以看出,这里会告诉AMS activity已经空闲(?我的理解就是activity对应的decor已经添加到WMS中并且已经展示出来)了。

    * `到这应用进程启动activity就算完成了。接着看AMS的后续处理。`
    * `ActivityManagerService.activityIdle() --6683`
        * `ActivityStackSupervisor.activityIdleInternalLocked()`
            * ```
    找到处理stopping状态的activity执行stop操作
    final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true);
            int NS = stops != null ? stops.size() : 0;
    for (int i = 0; i < NS; i++) {
                r = stops.get(i);
                final ActivityStack stack = r.task.stack;
                if (stack != null) {
                    if (r.finishing) {
                        stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
                    } else {
                        stack.stopActivityLocked(r);
                    }
                }
            }
              ```
            * `这里只是普通的跳转,不会执行finish.
    ActivityStack.stopActivityLocked() --3291`
                * `这里会判断要执行stop操作的activity有木有FLAG_ACTIVITY_NO_HISTORY的flag,如果有执行finish流程。这里不走。`
                * `ApplicationThread.scheduleStopActivity()
    到这里AMS又通过binder调用要执行stop操作的activity所在进程(可能是刚才启动的activity的进程也可能不是)。`
    
    * `回到应用进程ActivityThread中的ApplicationThread。
    ApplicationThread.scheduleStopActivity()`
        * `ActivityThread.handleStopActivity()`
            * `ActivityThread.performStopActivityInner()`
                * `Activity.performStop()`
                    * `Instrumentation.callActivityOnStop()`
                        * `Activity.onStop()`
        * ```
    执行完onStop后回到handleStopActivity.
    这里会post一个StopInfo的Runnable对象,用于通知AMS,activity已经stop完成。
    StopInfo info = new StopInfo();
     info.activity = r;
     info.state = r.state;
     info.persistentState = r.persistentState;
     mH.post(info);
    
        *  `ActivityManagerNative.getDefault().activityStopped()`
            * `ActivityManagerService.activityStopped()`
                * `ActivityStack.activityStoppedLocked()`
                    * `OVER`
    

    为了走通onFinish生命周期方法,这里我们模拟在刚刚启动的activity上执行返回操作,其实也就是调用finish方法

    Activity.finishActivity(){
        ActivityManagerNative.getDefault().finishActivity();
    }
    
    • ActivityManagerService.finishActivity() --4894

      • ActivityStack.requestFinishActivityLocked() --3328
        • ActivityStack.finishActivityLocked() --3523 这一步中有个重要的操作是调用ActivityRecord.makeFinishingLocked()方法把这个ActivityRecord标记为finishing状态,后面会用到
          • ActivityStack.startPausingLocked() --1141
            • ApplicationThread.schedulePauseActivity()
              • ActivityThread.handlePauseActivity()
                • ActivityThread.performPauseActivity()
                  • ActivityThread.performPauseActivityIfNeeded()
                    • Instrumentation.callActivityOnPause()
                      • Activity.perfomrPause()
                        * Activity.onPause()
                        * ActivityManagerNative.getDefault().activityPaused()
    • 在回到AMS中执行Activity已经pause完成的回调。

    • ActivityManagerService.activityPaused() --6919

      • ActivityStack.activityPausedLocked() --1212
        • ActivityStack.completePauseLocked()
          • 这里先判断ActivityRecord是否为finishing状态,当前为true ActivityStack.finishCurrentActivityLocked() 方法内部也只是把这个Activity加入到mStackSupervisor.mStoppingActivities列表中,等下次AMS回调activityIdle时在执行stop流程。
          • ActivityStackSupervisor.resumeFocusedStackTopActivityLocked() --1830
            • ActivityStack.resumeTopActivityUncheckedLocked() --2127
              • ActivityStack.resumeTopActivityInnerLocked() --2527
              • ApplicationThread.scheduleResumeActivity() 执行到这AMS工作完成,轮到应用进程自己执行activity的resume操作。
    • 到这又回到应用进程的ActivityThread招待handleResumeActivity()方法。因为前面记录activity启动过程时已经写过这个方法的执行流程,这里就不在重新写一遍了。唯一不同的是多了下面的执行restart的流程。

    • Activity.performResume() --6778

      • Activity.performRestart()
        • Instrumetation.callActivityOnRestart()
          • Activity.onRestart()
        • Activity.performStart()
          • Instrumetation.callActivityOnStart()
            • Activity.onStart()
    • 还有一点点不一样的地方就是执行完resume之后,调用Activity.makeVisible()不像之前启动时把decor添加到WMS,仅仅是设置为VISIBLE. 后面的就和之前的一样了,通过一个Idler调用AMS的activityIdle方法。直接拷贝之前的

    • ActivityManagerService.activityIdle() --6683

      • ActivityStackSupervisor.activityIdleInternalLocked()

    找到处理stopping状态的activity执行stop操作
    final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true);
    int NS = stops != null ? stops.size() : 0;
    for (int i = 0; i < NS; i++) {
    r = stops.get(i);
    final ActivityStack stack = r.task.stack;
    if (stack != null) {
    if (r.finishing) {
    stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
    } else {
    stack.stopActivityLocked(r);
    }
    }
    }
    ```
    * 这里因为是finishing状态,所以执行的是finishCurrentActivityLocked.还要注意这会传过去的mode参数为FINISH_IMMEDIATELY(立刻finish)。 ActivityStack.finishCurrentActivityLocked() --3597
    * ActivityStack.destroyActivityLocked() --4020
    * ApplicationThread.scheduleDestroyActivity()

    • 到这又回到了应用进程的ActivityThread中。 ActivityThread.handleDestroyActivity()
      • ActivityThread.performDestroyActivity()
        • ActivityThread.performPauseActivityIfNeeded() 不执行,因为已经pause过了。
        • Activity.performStop() --6857
          • Instrumentation.callActivityStop() --1289
            • Activity.onStop()
        • Instrumentation.callActivityOnDestroy() --1153
          • Activity.performDestroy() --6884
            • Activity.onDestroy()
      • 执行完performDestroyActivity后回到handleDestroyActivity,WindowManager调用removeViewImmediate(decorView)方法把activity显示的view从WMS中删除。
      • 最后通知AMS我执行destroy完成。 ActivityManagerNative.getDefault().activityDestroyed(). ActivityManagerService的activityDestroyed方法也只是调用了下ActivityStack的activityDestroyedLocked方法。后面就没什么东西了。。
    总结:感觉写了挺久的,但是回头看才这么点东西。。。而且大多都是代码。。。唉唉唉

    相关文章

      网友评论

        本文标题:Activity生命周期流程简单记录

        本文链接:https://www.haomeiwen.com/subject/zyabxxtx.html