我问你答-Activity 的状态保存方法

方法说明

onSaveInstanceState(Bundle outState)

系统通过该方法的调用,能在 Activity 销毁之前保存当前状态(具体业务状态保存哪些需要在方法内实现,例如保存当前页面正在进行到一半的输入内容等)。不过,这并不是 Activity 生命周期的一部分,如果要用生命周期做状态保存,可以考虑在 onPause() 方法中简单处理。并且,该方法只有在一些特殊场景下,系统才认为有必要执行(例如 Activity A 打开 Activity B 之后,由于系统资源不足,A 可能会被回收,这是就会触发。像正常的人为点击返回按钮销毁 B 是不触发该方法的调用。)

此外官方说明,对于 target sdk version 28 及以上的版本,会在 onStop() 方法之后调用,而低于 28 的版本,会在 onStop() 之前,但可能在 onPause() 之前或者之后。

onRestoreInstaceState(Bundle savedInstanceState)

该方法会在 Activity 被重新初始化时调用,用于恢复先前保存的状态,触发的时机是在 onStart() 方法之后,onPostCreate() 方法之前。

该方法的入参含义同 onCreate() 方法,所以对于重新初始化时的恢复状态即可以在 onCreate() 方法中实现,也可以在这个方法里实现,但建议还是在这个方法里做吧,做到功能单一嘛。

注意

这两个方法不像生命周期方法,不具有对称性。

触发时机

1.横竖屏切换

在可横竖屏旋转的 Activity 上,其生命周期如下
onPause() -> onSaveInstanceState(Bundle outState) -> onStop() -> onCreate() -> onStart() -> onRestoreInstanceState(Bundle savedInstanceState) -> onResume()

2.按 Home 键切到后台

仅调用 onSaveInstanceState(Bundle outState),如需要重建才会调用 onRestoreInstanceState(Bundle savedInstanceState)

3.资源回收等导致 Activity 被销毁

仅调用 onSaveInstanceState(Bundle outState),再次回到前台时会重建

4.当 Activity 变为栈底 Activity 时

仅调用 onSaveInstanceState(Bundle outState),如需要重建才会调用 onRestoreInstanceState(Bundle savedInstanceState)

参考文章:
Android 官方文档
重识Activity—Activity的生命周期

你可能感兴趣的:(我问你答-Activity 的状态保存方法)