【问题标题】:Activity Life Cycle Methods and Saving State活动生命周期方法和保存状态
【发布时间】:2013-02-27 16:58:53
【问题描述】:

我开始阅读有关活动生命周期回调和保存状态的信息,并且有很多我不明白的事情 - 我正在编写一个 android 应用程序,但我想问更一般的问题,而不是具体如何去做对于我目前进行的一些活动等,我想对它的工作原理有一个更好的整体了解!

我见过两种方法被使用(我见过一两种其他方法,但不想让自己更困惑......)

  • onPause、onResume 等,
  • 然后是 onSaveInstanceState 。

它们与我们应该寻找使用它们的环境之间有什么区别?我已经看到一些问题,海报使用正常生命周期回调之一,并被告知使用 onSaveInstanceState 代替,所以我们应该何时实现 onPause 而不是 onSaveInstanceState 等等。一些帖子提到了仅用于瞬态的方法,有人可以对此进行扩展吗?

我已经看到状态被用来表示稍微不同的东西 - UI/View 状态和 Activity 状态,两者之间有什么区别?
我也有点不确定他们所说的状态是什么意思,当我们保存状态时,我们到底保存了什么样的东西,谁能给出一些简单的例子(我不是指实际的代码)? android 开发者指南说android 系统会自动处理其中的一部分,那么我们应该关注什么? onCreate 和 onSaveInstanceState 使用的 Bundle 对象只存储简单的值,那么更复杂的对象和数组呢。

谢谢

【问题讨论】:

    标签: android android-lifecycle


    【解决方案1】:
    protected void onPause ()
    protected void onSaveInstanceState (Bundle outState)
    

    只要看一眼,onSaveInstanceState 就有一个 Bundle,您可以将需要保存的东西放入其中。并在 onCreate(Bundle) 或 onRestoreInstanceState(Bundle) 中取回它; 文档中的一些重要行:

    这个方法在一个activity可能被杀死之前被调用,这样当它 未来一段时间回来,它可以恢复其状态。不要 将此方法与活动生命周期回调混淆,例如 onPause(),当一个活动被放置时总是被调用 背景或正在销毁的途中,或 onStop() 是 在销毁之前调用。

    【讨论】:

      【解决方案2】:

      Android 可以在任何给定时间破坏您的活动,甚至终止您的进程(尽管在用户可见时不太可能 :-))。当用户导航回活动时,应该再次显示在他或她离开之前显示在屏幕上的数据/信息。

      onSaveInstanceState 回调允许您执行此操作。

      大多数视图已经自动为您执行此操作。例如。 EditText 中的当前文本、ListView 的当前滚动位置等都会自动为您保存。

      但是,有些内容不会自动为您保存。例如。 TextView 中的当前文本,特定 View 的(更改的)背景可绘制对象。

      假设您在用户操作失败后显示错误消息。然后错误消息显示在TextField 中,这个TextField 的背景变成红色(我只是在这里编造这个:-))。当用户在显示此错误时离开活动(例如按下 Home 按钮),活动将被销毁,当用户返回活动时,错误消息和红色背景将不再显示。

      这就是onSaveInstanceState 来救援的地方。
      您可以在其中保存包含错误消息的String。然后在重新创建activity时,onCreateBundle savedInstanceState不为空,可以查询错误信息。如果此消息不为 null/空,请在 TextView 上调用 setText 以获取错误消息并将 TextView 的背景设为红色。

      【讨论】:

      • 在错误消息示例中,它是否没有被保存,因为它不是在 onCreate 期间添加的初始 ui 的一部分?那么由于用户交互(或其他)而对 ui 所做的任何更改都不会自动保存?
      • 是的,完全正确。由于用户交互而对 ui 所做的一些更改将自动保存(例如,在 EditText 中键入文本)。但是在 TextView 上调用 setText 不会被保存,在 View 上调用 setBackgroundxxx() 也不会被保存。这就是你可以使用保存的实例状态来“修复”这个问题的地方。
      【解决方案3】:

      尝试使用此代码保存状态

      @Override
      protected void onSaveInstanceState(Bundle outState) {
        State s = new State(yourTextView.getText().toString());
        outState.putSerializable(State.STATE, s);
        super.onSaveInstanceState(outState);
      }
      
      @Override
      protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        State s = (State) savedInstanceState.getSerializable(State.STATE);
        yourTextView.setText(s.getYourTextViewText());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 2014-05-18
        • 1970-01-01
        相关资源
        最近更新 更多