转:https://www.jianshu.com/u/347890c1ed1e 文章
“onSaveInstanceState 会在系统意外杀死 Activity 时调用,或者横纵屏切换的时候调用”。
全局搜callActivityOnSaveInstanceState(:
可以看到调用这个方法的地方也就五个,而且都集中在ActivityThread里面。
先看第一个:
这是准备回调Activity的onPause的方法,可以看到在调用performPauseActivityIfNeeded之前,会先判断Activity是否已经finished还有targetSdkVersion(注意是targetSdkVersion,并不是SDK_INT)是否低于11(Android3.0),如果是的话,就会在Activity的onPause之前调用callActivityOnSaveInstanceState方法,这个方法最终会回调Activity的onSaveInstanceState:
其实shouldSaveState上面的那行注释也已经说明了,targetSdk低于11的app,会在onPause之前保存状态。
好,接着看下一个:
这次我们先看开头的注释:targetSdk低于28的app,会在onStop之前回调onSaveInstanceState,从targetSdk 28开始,onSaveInstanceState在onStop回调之后才回调,而低于11的app,永远都会在onPause之前回调。
代码逻辑跟注释说的无异。
总结:
Activity的onSaveInstanceState回调时机,取决于app的targetSdkVersion:
targetSdkVersion低于11的app,onSaveInstanceState方法会在Activity.onPause之前回调;
targetSdkVersion低于28的app,则会在onStop之前回调;
28之后,onSaveInstanceState在onStop回调之后才回调。