Activity生命周期流程简单记录

说到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方法。后面就没什么东西了。。
总结:感觉写了挺久的,但是回头看才这么点东西。。。而且大多都是代码。。。唉唉唉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容