【问题标题】:Saving state between activities在活动之间保存状态
【发布时间】:2011-04-30 16:27:21
【问题描述】:

我有 2 个活动,名为 FirstActivity.javaSecondActivity.java

当我单击FirstActivity 中的按钮时,我调用SecondActivity。当我从SecondActivity 返回时,根据结果,我需要跳过FirstActivity 中的一些步骤,这些步骤在其onCreate() 方法中执行。

SecondActivity 回来,我使用Bundle 将我作为输入提供的数据放入Intent。我在第一次活动的onCreate() 中访问了该数据。

当我开始时,活动应用程序崩溃,在我访问第二个活动数据的行中显示为NullPointerException

我认为原因是应用程序第一次启动时Bundle 中没有值

那么,谁能帮我解决这个问题?

【问题讨论】:

  • 如果您的调用堆栈是 FirstActivity->(屏幕上的按钮)->SecondActivity->(硬件后退按钮)->FirstActivity...则不会再次为 FirstActivity 调用 onCreate()。
  • Vuk,你声明了一个错误的假设。当 FirstActivity 在后台时,它可能是 OR 可能不会被操作系统破坏(这取决于当前的 RAM 状态)。
  • 是的,Arhimed,我同意。虽然我会亲自将“Android_programmer_camera”想要多次运行的所有代码添加到......嗯......比如说onResume()或onRestoreInstance()或其他东西。我的观点是,每次在活动和 onCreate() 之间切换时,他都不能指望内存不足的情况。但你是对的,我对 onCreate() 从来没有被多次调用有点明确,这可能会发生。干杯:)

标签: android


【解决方案1】:

您必须实现 onSaveInstanceState(Bundle savedInstanceState) 并将想要保存的值保存到 Bundle 中。实现onRestoreInstanceState(Bundle savedInstanceState) 恢复Bundle并重新设置数据:

public class MyActivity extends Activity {
    /** The boolean I'll save in a bundle when a state change happens */
    private boolean mMyBoolean;

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putBoolean("MyBoolean", mMyBoolean);
        // ... save more data
        super.onSaveInstanceState(savedInstanceState);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mMyBoolean = savedInstanceState.getBoolean("MyBoolean");
        // ... recover more data
    }
}

这里你会找到关于状态处理的使用文档:http://developer.android.com/reference/android/app/Activity.html

只需在文档中搜索这些方法即可:P

【讨论】:

  • 如何在 onCreate() 方法中访问这些数据?
  • 是onCreate()提供的参数:public void onCreate(Bundle savedInstanceState)
  • 如何在 onCreate() 中访问 myBoolean,因为它是局部变量。如果我们将其设为全局变量,其结果将与 OnRestoreInstanceState() 方法中的值不同
  • 这个想法是将“getBoolean”的内容写入从活动中获取的变量中。这样您就可以恢复该价值。我会编辑我的帖子:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多