【问题标题】:onCreate(Bundle savedInstanceState) in always nullonCreate(Bundle savedInstanceState) 始终为空
【发布时间】:2013-03-28 16:20:49
【问题描述】:

我知道,这个问题之前在 stackoverflow 上被问过,但没有一个答案对我有用。

可能值得一提:

  • 我将 ActionBarSherlock 与支持包一起使用。
  • 方法onSaveInstanceState在我按下主页按钮时被调用。 onCreate 方法总是为 Bundle savedInstanceState 提供 NULL。
  • 方法onRestoreInstanceState 根本不会被调用。 (我不介意onCreate 是否有效;))。
  • 另外(没关系)我尝试将super.onSaveInstanceState(outState) 放在onSaveInstanceState 的底部。也没有运气。

这是代码。我希望有人遇到这个问题并解决它。

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。

【问题讨论】:

    标签: android android-lifecycle activity-lifecycle


    【解决方案1】:

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

    我花了几个小时寻找答案,就这么简单。

    【讨论】:

    • 如果我仍然希望 noHistory 成为 true 怎么办?
    【解决方案2】:

    在我的例子中,原因是特定活动没有在清单文件中声明主题。

    要解决此问题,请打开 AndroidManifest.xml,单击 Application,在 Application Nodes 中选择崩溃的活动,然后在 Attributes 的 Theme 字段中添加主题。就我而言,它是

    @style/Theme.AppCompat.Light.DarkActionBar
    

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

    P.S.:我知道这是一个老问题的答案,但我在寻找修复程序时偶然发现了它,但没有找到可行的解决方案,因此这可能对其他人有所帮助。

    【讨论】:

      【解决方案3】:

      onRestoreInstanceState(或 onCreate 中保存的包)将在 Activity 由于缺乏资源而被系统杀死并在您返回时重新启动时触发。 Activity 可能不会被杀死(只是停止)并在不经过 onRestoreInstanceState 的情况下重新启动。换句话说,onSaveInstanceState 会一直被调用,但是 onRestoreInstanceState 如果被系统杀死并恢复,就会被调用。不仅仅是停止和重新启动,也不是暂停和恢复,也不是由新意图启动。

      在这里查看我的解释。我确定它涵盖了您的问题。

      when is onRestoreInstanceState called?

      【讨论】:

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

      当您按下 HOME 按钮时,您的 Activity 会暂停并且不会被销毁因此当您从主屏幕再次启动应用程序时,不会调用 onCreate,除非操作系统杀死您的应用程序以回收内存。如果您希望在从主屏幕启动时重新创建 Activity,请将此行 android:finishOnTaskLaunch="true" 放入 Activity 清单中。

      【讨论】:

      • 可能不得不更清楚地提及它,但我确实调用了 onCreate(总是返回 null),因为我通过向右滑动来停止任务管理器中的应用程序。在我的日志中,当我再次启动应用程序时,我看到 onCreate IS 被调用。
      • 如果你杀死你的应用程序,那么我认为操作系统不会再保持你的活动状态了。但是试试 android:alwaysRetainTaskState="true" 看看它是否有效。
      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多