onSaveInstanceState 没有被调用

Posted

技术标签:

【中文标题】onSaveInstanceState 没有被调用【英文标题】:onSaveInstanceState is not getting called 【发布时间】:2015-03-28 11:27:48 【问题描述】:

我有一个活动,它为结果代码启动各种活动,并在onActivityResult 方法中获取结果时,它会根据结果代码启动适当的活动。

onSaveInstanceState 没有在为结果而启动的 Activity 中被调用。

例如 Navigation Activity 启动 Activity A 为:

Intent intent = new Intent(this, A.class);
    startActivityForResult(intent, Constants.REQUEST_CODE);

然后 A 通过设置结果代码完成,因此 App 将再次重定向到 Navigation 活动并调用 onActivityResult 方法。

所以我的问题是:为什么 Activity A 的 onSaveInstanceState 在完成时没有被调用并导航回 Navigation Activity ?

【问题讨论】:

您是否在清单中为活动 A 添加了 configChanges? 不,我没有为该活动添加任何配置更改,只是声明了该活动 @RahulGupta 我应该在 Activity A 的 mnifest 中做出哪些改变 onSave 不会在自然应用程序完成场景中调用。它在方向改变时调用,如果 os 杀死你的应用程序。无论您在 onSaveInstance 中做什么,您也可以在 onDestroy 中执行。 @RahulGupta 如何在 onDestroy 中存储活动状态 【参考方案1】:

onSaveInstanceState() 仅在 Activity 被杀死时调用。

我不知道你到底想在那个方法中做什么,但你可能应该把你的代码移到Activity Lifecycle 的相应方法中。

来自http://developer.android.com/reference/android/app/Activity.html

请注意,将持久数据保存在 onPause() 而不是 onSaveInstanceState(Bundle) 中很重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下都被调用。

method description for onSaveInstanceState() 也准确描述了您的情况:

不要将此方法与活动生命周期回调混淆,例如 onPause(),它总是在活动被置于后台或销毁途中调用,或 onStop(),在销毁之前调用。当用户从活动 B 导航回活动 A 时调用 onPause() 和 onStop() 而不是此方法的一个示例:不需要在 B 上调用 onSaveInstanceState(Bundle),因为该特定实例将永远不会被恢复,因此系统避免调用它。调用 onPause() 而不是 onSaveInstanceState(Bundle) 的示例是,当活动 B 在活动 A 之前启动时:如果活动 A 在 B 的生命周期内没有被杀死,系统可能会避免在活动 A 上调用 onSaveInstanceState(Bundle),因为A 的用户界面状态将保持不变。

【讨论】:

T 我已经编写了代码来保存 Parcelable 对象的 Parcelable 数组列表,它不是永久数据。当我用户返回该活动时,我只想要以前修改过的列表。实际上,在其他活动中,我有一个添加更多按钮,该按钮再次重定向到此活动【参考方案2】:

Activity 像按下后退按钮一样自然结束时,不会调用方法onSaveInstanceState()。那是您的应用程序本身破坏了Activity。仅当 Android 操作系统预计它可能必须终止您的活动以回收资源时才会调用该方法。

如果 Activity 实际上被 Android 杀死,操作系统将确保您收到对 onRestoreInstanceState() 的调用,并传递您用于在 onSaveInstanceState() 方法中保存活动状态的同一个包。

来自文档:

此方法在活动可能被杀死之前调用,以便 当它在未来某个时间回来时,它可以恢复它的状态。 例如,如果活动 B 在活动 A 之前启动,并且在 某点活动 A 被杀死以回收资源,活动 A 将 有机会通过这个保存其用户界面的当前状态 方法,以便当用户返回活动 A 时, 用户界面可以通过onCreate(Bundle)onRestoreInstanceState(Bundle).

【讨论】:

我已经编写了代码来保存 Parcelable 对象的 Parcelable 数组列表,它不是永久数据。当我用户返回该活动时,我只想要以前修改过的列表。实际上,在其他活动中,我有一个添加更多按钮,该按钮再次重定向到此活动 如果数据不是永久性的,即您不能将其保存到文件或共享首选项等,则调用活动(带有添加按钮的活动)应保留此列表并将其传递为Intent 启动视图列表活动时的附加功能。此活动应以startActivityForResult() 开始,以便它可以将修改后的列表传递回调用活动。【参考方案3】:

我在“主要活动”的“抽屉菜单”部分也遇到了同样的问题,因为我在主要活动中覆盖了“onSaveInstanceState”方法,但忘记了对 super.onSaveInstanceState() 的调用(因此,它永远不会调用我的“抽屉菜单”的“onSaveInstanceState()”方法,这是这个主要活动的一部分。

换句话说:确保在必要时不要忘记对“super.onSaveInstanceState()”的调用。

【讨论】:

以上是关于onSaveInstanceState 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

savedInstanceState 是 null 并且 onSaveInstanceState 没有被调用

Android-onSaveInstanceState方法啥时候被调用

Xamarin Android:为什么重写OnSaveInstanceState永远不会被调用?

究竟何时调用 onSaveInstanceState() 和 onRestoreInstanceState()?

onSaveInstanceState和onRestoreInstanceState

android一个示例同时在onSaveInstanceState和onPause中调用数据保存函数,这是为啥?