4

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

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

例如 Navigation Activity 将 Activity A 启动为:

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

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

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

4

3 回答 3

7

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

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

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

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

onSaveInstanceState()的方法描述也准确描述了您的情况:

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

于 2015-01-29T09:47:42.883 回答
1

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

如果Activitythen 真的被 Android 杀死了,操作系统会确保你收到一个调用,onRestoreInstanceState()并传递你用来在onSaveInstanceState()方法中保存活动状态的同一个包。

从文档:

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

于 2015-01-29T09:46:29.530 回答
0

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

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

于 2015-12-07T15:49:04.760 回答