前言
Android面试时问到onSaveInstanceState相关知识,因此今天抽空记录一下相关内容,方便后续自己查阅。
本文Activity是以默认的启动模式,也就是standard模式下测试的。
正文
对应Android中Activity状态的保存,主要涉及onSaveInstanceState(),onCreate()和onRestoreInstanceState()三个方法。
下面分别先介绍一下,然后但深入的分析相关内容。
onSaveInstanceState()
在离开页面的时候用onSaveInstanceState中的outState可以保存你所需要的值。
@Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("oorr.cn", 111); }
在测试中,发现很多情况下都会调用,下面简单列举几种情况:
按Home
按Back
启动新的Activity
切换语言
屏幕旋转
执行顺序
onPause() -> onStop() -> onSaveInstanceState() -> onDestroy()
虽然执行了onSaveInstanceState()并保存了数据,但onCreate()中的savedInstanceState还是可能为null或者onRestoreInstanceState()未必会被调用。
onCreate()
onCreate()是在活动或碎片首次创建时调用的,用于初始化界面和加载数据。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null ) { int oorr = savedInstanceState.getInt("oorr.cn"); } }
么次都会调用,但savedInstanceState可能为null。
savedInstanceState不为null情况下,暂时有如下情况:
切换语言
旋转屏幕
对于低内存被kill,重新打开会走的说法,暂时没看到。
onRestoreInstanceState()
恢复Acticivity被销毁前的状态。
在重新回到该页面的时候可以使用onRestoreInstanceState从saveInstanceState()中获取保存过得值来重新初始化界面。
@Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); int oorr = savedInstanceState.getInt("oorr.cn"); }
虽然重写了,但不一定执行哈。
对于onRestoreInstanceState()调用,暂时有如下情况:
切换语言
旋转屏幕
执行顺序
onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
小结
onSaveInstanceState()虽然保存了数据,但onCreate中savedInstanceState未必有数据或onRestoreInstanceState()未必会被调用。
目前发现非人为下(切换语言,屏幕旋转等)销毁Activity,重启后onCreate中savedInstanceState不为null或onRestoreInstanceState()才会被调用。
onSaveInstanceState()在onStop()之后调用,onRestoreInstanceState()在onStart()调用。
注意:onSaveInstanceState()是用来保存UI状态,onPause()适合用于数据的持久化保存。
参考文章
《》
《》
《