onCreate(Bundle savedInstanceState)中始终为null

6

我知道,在stackoverflow上之前也有人问过这个问题,但是那些答案都对我不起作用。

值得一提的是:

  • 我使用ActionBarSherlock和支持包。
  • 按下home键时会调用onSaveInstanceState方法。而onCreate方法总是返回null给Bundle savedInstanceState。
  • onRestoreInstanceState方法根本没有被调用。(如果onCreate方法能正常工作,我倒也不介意)。
  • 另外(这应该不重要),我尝试在onSaveInstanceState方法的底部放置了super.onSaveInstanceState(outState)语句,也没有用。

以下是代码,希望有人能解决我的问题。

public class MainActivity extends SherlockFragmentActivity {

    private static final String LOG_TAG = MainActivity.class.getSimpleName();

    private static String STATE_TO_STORE = "state_to_store";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        

        Log.d(LOG_TAG, "onCreate: savedInstanceState = " + (savedInstanceState == null ? "NULL" : "Not NULL"));

        // ... more code...
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        Log.d(LOG_TAG, "onRestoreInstanceState: savedInstanceState = " + (savedInstanceState == null ? "NULL" : "Not NULL"));
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt(STATE_TO_STORE, 5); // store some int

        Log.d(LOG_TAG, "onSaveInstanceState bundle: " + outState.toString());
    }

    // ... more code ...

}

记录清楚表示 onSaveInstanceState 被调用,而 onCreate 得到的 savedInstanceState = NULL
4个回答

12

检查您的清单文件是否不包含android:noHistory="true"。


我花了几个小时寻找答案,结果很简单。


1
如果我仍然希望noHistory保持为true呢? - Jonas

3
在我的情况下,问题在于特定的活动没有在清单文件中声明主题。要解决这个问题,打开AndroidManifest.xml,点击Application,在Application Nodes中选择崩溃的活动,并在Attributes的Theme字段中添加主题。在我的情况下,它是:
@style/Theme.AppCompat.Light.DarkActionBar

但是你可以从其他活动中复制主题。

P.S.:我知道这是对一个旧问题的答案,但我在寻找解决方案时偶然发现它,并没有找到有效的解决方法,所以这可能会帮助其他人。


2
当Activity由于资源不足而被系统杀死并在返回时重新启动时,onRestoreInstanceState(或在onCreate中保存的bundle)将被触发。Activity可能不会被杀死(只是停止),并且可能会在不经过onRestoreInstanceState的情况下重新启动。换句话说,onSaveInstanceState将始终被调用,但如果系统将其杀死并恢复,则会调用onRestoreInstanceState。不仅仅是停止和重新启动,也不是暂停和恢复,也不是通过新意图启动。
请查看我在此处的解释。我相信它涵盖了您的问题。

看起来不错,但我该如何测试呢?我该如何通过系统触发应用程序的停止/终止?我自己在安卓手机上尝试的所有方法都没有触发onRestoreInstanceState。另外,如果这个方法可行,那么如果用户自己停止/终止了这个应用程序,我该如何保存状态呢?在我看来,只能使用SharedPreferences了... - Almer
onSaveInstanceState用于保存和恢复被系统中断时的状态(打开的对话框、列表位置等)。如果您想保存一些在关闭应用程序或重新启动时应该保留的自己的状态,您应该选择SharedPreferences并在onPause()中保存状态。 - Yaroslav Mytkalyk
@DoctororDrive 您的Activity可能会被调用两次,这样您就有一个实例在后台运行,随时可以在以后恢复,另一个实例在前台活动。就像当您有一个Activity也响应android.intent.action.CREATE_SHORTCUT时。在这种情况下,用于创建快捷方式的Activity正在前台运行,并且将在后台Activity再次进入前台之前被销毁,这可能是历史堆栈中的几个位置。在这种情况下,快捷方式创建“模式”将覆盖旧的共享首选项。 - Daniel F
1
虽然这是一个老问题,但在 Android 设备或模拟器上有一个名为“不保留活动”的“开发者选项”。只需激活它,然后点击“方形”按钮离开您的应用程序,再通过单击其缩略图回到您的应用程序。由于该选项,应用程序应该已经经历了保存/恢复周期(您可以使用断点检查)。 - Pelpotronic

2
当你按下HOME键时,你的活动会暂停而不被销毁。因此,当你再次从主屏幕启动应用程序时,除非操作系统终止你的应用程序以回收内存,否则不会调用onCreate方法。如果你希望在从主屏幕启动时重新创建你的活动,请在活动清单中添加以下代码:android:finishOnTaskLaunch="true"

可能需要更清楚地说明一下,但我确实调用了onCreate(只是始终返回null),因为我通过将应用程序在任务管理器中向右滑动来停止它。在我的日志中,当我再次启动应用程序时,可以看到onCreate正在被调用。 - Almer
如果你关闭了应用程序,我认为操作系统不会再保留你的活动状态。但是尝试使用android:alwaysRetainTaskState="true",看看是否有效。 - Hoan Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接