onSaveInstanceState没有被调用

时间:2015-01-29 09:38:49

标签: android start-activity activity-state

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

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

例如,导航活动将活动A启动为:

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

然后A通过设置结果代码完成,以便App再次重定向到导航活动,并调用onActivityResult方法。

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

3 个答案:

答案 0 :(得分:6)

只有在杀死Activity时才会调用

onSaveInstanceState()。

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

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

  

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

此外,method description for onSaveInstanceState()完全描述了您的情况:

  

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

答案 1 :(得分:1)

onSaveInstanceState()自然地按下后退按钮时,不会调用方法Activity。这是你的应用程序本身摧毁Activity。只有在Android操作系统预期它可能必须终止您的活动以回收资源时才会调用该方法。

如果Activity实际上被Android杀死,操作系统将确保您收到onRestoreInstanceState()的来电,同时传递您用于保存活动状态的相同捆绑{{1}方法。

来自文档:

  

此方法在活动可能被杀死之前被调用   当它回来的某个时候它可以恢复它的状态。   例如,如果活动B在活动A和之前启动   某些点活动A 被杀死以回收资源,活动A会   有机会通过它保存其用户界面的当前状态   方法使用户返回活动A时的状态   用户界面可以通过onSaveInstanceState()或   onCreate(Bundle)

答案 2 :(得分:0)

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

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