【问题标题】:What is better for my needs, onPause() or onSaveInstanceState()?onPause() 或 onSaveInstanceState() 哪个更符合我的需求?
【发布时间】:2011-06-28 02:59:50
【问题描述】:

我有一个包含三个页面的应用程序,其中一个是主页。如果用户转到两个子页面之一,用户可以输入一些我想保存的字段。我一直在研究 onPause() 和 onSaveInstanceState()。我想我只想对这两者有一个清晰的解释,以及 onPause() 是否更好以及代码示例。这就是我对 onSaveInstanceState() 的追求。

protected void onSaveInstanceState(Bundle outState) {
    // Save away the original text, so we still have it if the activity
    // needs to be killed while paused.

    outState.putDouble("quizPts",qpts);
    outState.putDouble("quizV",qvalue);
    outState.putDouble("tPts",tpts);
    outState.putDouble("tValue", tvalue);
    outState.putDouble("hPts", hpts);

这就是我设置捆绑包的方式,给它一个 ID 和一个值。

public void onRestoreInstanceState(Bundle outState) {
  super.onRestoreInstanceState(outState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  qpts = outState.getDouble("quizPts");
  qvalue = outState.getDouble("quizV");
  tpts = outState.getDouble("tPts");
  tvalue = outState.getDouble("tValue");
  hpts = outState.getDouble("hPts");

这就是我打算恢复它的方式,问题是我不明白如何传递 Bundle 来恢复它。我正在设置我需要返回到设置到 UI 的变量的变量。

任何建议都会很棒

感谢一个初学者的androider

【问题讨论】:

    标签: java android bundle onpause


    【解决方案1】:

    最好的选择是共享偏好。当应用程序由于电话或其他原因暂停时,onpause 旨在解决您的问题。但是,如果您使用共享首选项,它会为您提供保存数据的方法,并在保存的值不可用时使用默认值恢复它。此数据将在用户会话中持续存在(即使您的应用程序被终止)。但如果您打算保存原始数据类型(如 bool、int 等)以外的内容,这不是一个好选择。

    http://developer.android.com/guide/topics/data/data-storage.html#pref

    【讨论】:

      【解决方案2】:

      您不需要在自己周围传递捆绑包:Activity 框架会处理这些。使用onSaveInstanceState():如果您的 Activity 类因任何原因被系统销毁,它将被调用,因此您应该可以将逻辑放在那里。 onPause 将始终在您离开 Activity 时被调用,无论 Activity 是否被销毁。

      我还会在您的onRestoreInstanceState 中添加支票:

      public void onRestoreInstanceState(Bundle outState) {
        super.onRestoreInstanceState(outState);
        // Restore UI state from the savedInstanceState.
        // This bundle has also been passed to onCreate.
        if(outState.containsKey("quizPts")) qpts = outState.getDouble("quizPts");
        if(outState.containsKey("quizV")) qvalue = outState.getDouble("quizV");
        if(outState.containsKey("tPts")) tpts = outState.getDouble("tPts");
        if(outState.containsKey("tValue")) tvalue = outState.getDouble("tValue");
        if(outState.containsKey("hPts")) hpts = outState.getDouble("hPts");
      

      【讨论】:

      • 所以如果我没有通过任何东西,我是否需要 Bundle 是全局的?如果我这样做 onSaveInstanceState() 是多余的吗?我需要两者都做还是只选一个?
      • Bundle是为你提供的,和Android平台调用方法一样。你根本不需要做任何事情。没有全局变量,什么都没有。只需实现这两个方法,它们就会在需要时被调用。
      • Re“如果您的 Activity 类因任何原因被系统销毁,它将被调用”。不是出于任何的原因,而是在 OP 的用例中,是的。不能依赖 onSaveInstanceState 获取任何真正重要的信息。
      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 2013-02-02
      • 2012-02-05
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多