Activity中生命周期回调的疑惑

MainActivity的onCreate方法中有如下代码:

registerActivityLifecycleCallbacks(
            object : Application.ActivityLifecycleCallbacks {
                  //...略其他实现方法

                override fun onActivityPreStarted(activity: Activity) {
                    Log.d("===main", "onActivityPreStarted")
                }

                override fun onActivityStarted(activity: Activity) {
                    Log.d("===main", "onActivityStarted")
                }

                override fun onActivityPostStarted(activity: Activity) {
                    Log.d("===main", "onActivityPostStarted")
                }
               
                override fun onActivityPreResumed(activity: Activity) {
                    Log.d("===main", "onActivityPreResumed")

                }
                override fun onActivityResumed(activity: Activity) {
                    Log.d("===main", "onActivityResumed")
                }

                override fun onActivityPostResumed(activity: Activity) {
                    Log.d("===main", "onActivityPostResumed")
                }
            })

打印日志如下:按照生命周期的执行顺序来说一点毛病都没有

myapplication D/===main: onActivityPreStarted
myapplication D/===main: onActivityStarted
myapplication D/===main: onActivityPostStarted
myapplication D/===main: onActivityPreResumed
myapplication D/===main: onActivityResumed
myapplication D/===main: onActivityPostResumed

Activity的onStart和onResume生命周期执行源码如下,省略部分代码:

final void performResume(boolean followedByPause, String reason) {
        //这里边执行了onActivityPreResumed的回调,按理说onActivityPreResumed回调应该先打印啊
        dispatchActivityPreResumed();
        //方法执行流程如下:performStart  ->  dispatchActivityPreStarted  ->  callActivityOnStart  ->  dispatchActivityPostStarted
        //start相关的生命周期打印没毛病
        performRestart(true /* start */, reason);
        //略....
        //执行了onResume,onResume中执行onActivityResumed的回调
        mInstrumentation.callActivityOnResume(this);
        //略....
        //最后回调了onActivityPostResumed 也没毛病
        dispatchActivityPostResumed();
    }

通过上面的注释大概猜到了我的问题,dispatchActivityPreResumed代码顺序优先与performRestart方法内的start生命周期回调,但我打印的结果缺指向这执行顺序不太对,有没有大佬帮我解答一下

阅读 2.9k
1 个回答
performResume(boolean, String) 调用的是 performRestart(boolean, String),不是直接调用的 performStart(String)

performRestart(boolean, String)关键代码如下:

final void performRestart(boolean start, String reason) {
    ...
    
    if (mStopped) {
        mStopped = false;
        ...

        mCalled = false;
        mInstrumentation.callActivityOnRestart(this);
        ...
        
        if (start) {
            performStart(reason);
        }
    }
}

performResume(boolean, String) 如果想要通过 performRestart(boolean, String) 间接调用到 performStart(String),要求mStoppedtrue,也就是在performStop(boolean, String)之后被调用,但是正常切换应用的调用流程一般不会出现这种情况,一般调用顺序:

 D/MainActivity: onActivityStarted
 D/MainActivity: onActivityPreResumed
 D/MainActivity: onActivityResumed
 D/MainActivity: onActivityPaused
 D/MainActivity: onActivityStopped
 D/MainActivity: onActivitySaveInstanceState

 D/MainActivity: onRestart
 D/MainActivity: onActivityStarted
 D/MainActivity: onActivityPreResume
 D/MainActivity: onActivityResume

最后再看下performRestart(boolean, String)被调用时的调用堆栈信息(直接被ActivityThread调用的),如下图:

image.png


参考资料

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题