Android 未调用onSaveInstanceState

Android 未调用onSaveInstanceState,android,start-activity,activity-state,Android,Start Activity,Activity State,我有一个活动,它为结果代码启动各种活动,在onActivityResult方法中获得结果时,它会根据结果代码启动相应的活动 在为结果启动的活动中未调用onSaveInstanceState 例如,导航活动以以下方式启动活动A: Intent intent = new Intent(this, A.class); startActivityForResult(intent, Constants.REQUEST_CODE); 然后通过设置结果代码完成,这样应用程序将再次重定向到导航活动,并

我有一个活动,它为结果代码启动各种活动,在
onActivityResult
方法中获得结果时,它会根据结果代码启动相应的活动

在为结果启动的活动中未调用onSaveInstanceState

例如,导航活动以以下方式启动活动A:

Intent intent = new Intent(this, A.class);
    startActivityForResult(intent, Constants.REQUEST_CODE);
然后通过设置结果代码完成,这样应用程序将再次重定向到导航活动,并调用
onActivityResult
方法


所以我的问题是:为什么活动A的
onSaveInstanceState
在完成时没有被调用,并且导航返回到导航活动?

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

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

从文档中:

在可以终止活动之前调用此方法,以便 当它在将来某个时候回来时,它可以恢复它的状态。 例如,如果活动B在活动A之前启动,则 某点活动A被杀死以回收资源,活动A将 有机会通过此保存其用户界面的当前状态 方法,以便当用户返回到活动A时 用户界面可以通过
onCreate(Bundle)
onRestoreInstanceState(捆绑包)

仅当活动被终止时,才会调用onSaveInstanceState()

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

发件人:

请注意,在onPause()而不是onSaveInstanceState(Bundle)中保存持久性数据非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下调用

此外,报告还准确描述了您的情况:

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


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


换句话说:确保您没有忘记调用“super.onSaveInstanceState()”必要时。

您在清单中添加了活动A的配置更改了吗?没有,我没有为该活动添加任何配置更改,只是声明了activity@RahulGupta对于活动AonSave,我应该在mnifest中进行哪些更改,将不会在自然应用程序完成场景中调用。它在方向改变时调用,如果操作系统杀死你的应用程序。无论您在onSaveInstance中执行什么操作,您也可以在onDestroy中执行。@RahulGupta如何在onDestroyT中存储活动状态我已经编写了代码来保存可传送对象的可传送数组列表,它不是永久数据。当我的用户返回到那个活动中时,我只想要以前修改过的列表。实际上,在其他活动中,我有一个“添加更多”按钮,该按钮再次重定向到此活动。我编写了代码来保存可包裹对象的可包裹数组列表,它不是永久数据。当我的用户返回到那个活动中时,我只想要以前修改过的列表。实际上,在其他活动中,我有一个“添加更多”按钮,该按钮会再次重定向到此活动。如果数据不是永久性的,即您无法将其保存到文件或共享prefs等。则调用活动(带有“添加”按钮的活动)应保留此列表,并在启动“查看列表”活动时将其作为
Intent
extras传递。此活动应使用
startActivityForResult()
启动,以便将修改后的列表传递回调用活动。