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生命周期回调,但我打印的结果缺指向这执行顺序不太对,有没有大佬帮我解答一下
performRestart(boolean, String)
关键代码如下:performResume(boolean, String)
如果想要通过performRestart(boolean, String)
间接调用到performStart(String)
,要求mStopped
为true
,也就是在performStop(boolean, String)
之后被调用,但是正常切换应用的调用流程一般不会出现这种情况,一般调用顺序:最后再看下
performRestart(boolean, String)
被调用时的调用堆栈信息(直接被ActivityThread
调用的),如下图:参考资料