【问题标题】:using onResume and onPause使用 onResume 和 onPause
【发布时间】:2012-08-11 11:26:34
【问题描述】:

假设我有两个活动,活动 1 和活动 2。 我想从活动 1 导航到活动 2,从活动 2 获取一些信息并将其插入活动 1,而且我不想在离开时丢失活动 1 的先前状态。 我怎样才能保存它的状态?

【问题讨论】:

    标签: android android-activity onresume onpause


    【解决方案1】:

    您所描述的是使用Activity.startActivityForResult() 方法的完美经典理由。

    这是谷歌在这个方法文档中写的:

    启动一项您希望在完成后获得结果的活动。当此活动退出时,您的 onActivityResult() 方法将使用给定的 requestCode 调用

    所以你应该做的是:从你的活动1开始活动的结果,从活动2使用setResult(int resultCode, Intent data)方法和你希望你的活动1取回的数据,并调用finish()(它会回到@ 987654324@ 在同一状态活动1之前..)。

    【讨论】:

      【解决方案2】:

      activity1 中覆盖onSaveInstanceState(Bundle) 以保存您想要的任何数据,然后在同一活动中覆盖onRestoreInstanceState(Bundle) 以取回值。使用Bundle,您可以存储几乎任何您想要的数据。我会推荐这样的东西:

      public class MainActivity extends Activity {
          ...
          public static final String DATA1_KEY = "data1";
      
          private boolean value1;
          ...
      
          @Override 
          protected void onSaveInstanceState (Bundle outState) {
              outState.putBoolean(DATA1_KEY, value1);
          }
      
          @Override
          protected void onRestoreInstanceState (Bundle savedInstanceState) {
              value1 = savedInstanceState.getBoolean(DATA1_KEY);
          }
      }
      

      【讨论】:

        【解决方案3】:

        你应该覆盖onSaveInstanceState(Bundle savedInstanceState)

        示例代码请查看this答案

        或使用SharedPreferences。检查this代码

        【讨论】:

          【解决方案4】:

          如果您只想在运行时保持数据活动,请考虑使用静态成员。然后,您可以从任何活动中访问和操作这些成员。例如:

          public class FirstActivity extends Activity
          {
              public static String data = null;
          
              public void onCreate(Bundle savedInstanceState)
              {
                  super.onCreate(savedInstanceState);
                  setContentView(...);
                  data = "This is a test!";
              }
          }
          

          从您的第二个活动中,您可以访问这些静态变量,例如

          public class SecondActivity extends Activity
          {
              public void onCreate(Bundle savedInstanceState)
              {
                  super.onCreate(savedInstanceState);
                  setContentView(...);
                  if(FirstActivity.data!=null)
                  {
                      //You can use it:
                      System.out.println(FirstActivity.data);
                  }
              }
          }
          

          当然你可以添加getter/setter函数,让它更安全、更优雅。

          如果您想存放更长时间,请考虑使用:

          【讨论】:

            【解决方案5】:

            用户在您的应用中执行一项操作以启动新活动。创建第二个活动时,当前活动将停止。如果用户随后按下返回按钮,则重新启动第一个活动。

            当您的活动停止时,活动对象会一直驻留在内存中,并在活动恢复时被调用。您不需要重新初始化在导致 Resumed 状态的任何回调方法期间创建的组件。系统还会跟踪布局中每个 View 的当前状态,因此如果用户在 EditText 小部件中输入文本,则该内容会被保留,因此您无需保存和恢复它。

            注意:即使系统在停止时销毁了您的 Activity,它仍然会在 Bundle(一个键值对对)并在用户导航回活动的同一实例时恢复它们。
            CommonsWare here 说:

            当用户“按下 BACK 按钮”时,Bundle 从 onSaveInstanceState() (如果有的话)被丢弃,正如用户所指出的 他们完成了活动。 onSaveInstanceState() 包 在用户没有说他们完成的情况下使用 活动(例如,他们接听了来电)但 Android 选择销毁活动以释放 RAM。

            文档说:

            请注意,在 onPause() 中保存持久数据很重要 onSaveInstanceState(Bundle) 因为后者不是 生命周期回调,因此不会在每种情况下都被调用为 在其文档中描述。

            换句话说,将非 View 对象的保存/恢复代码放在 onPause() 和 onResume() 中,而不是 onSaveInstanceState(Bundle) 和 onRestoreInstanceState(Bundle)。最后我猜你不需要如果您只有 View 对象,则保存任何状态,如果您有任何其他状态,您可以使用preferencesfilesqlite 将它们保存在onPause() 中并在onResume() 中检索它们。

            您可以在这些页面中查看更多详细信息:
            Stopping and Restarting an Activity
            Saving Activity state in Android
            Android wont save the current state of an activity

            【讨论】:

              猜你喜欢
              • 2012-05-08
              • 1970-01-01
              • 2023-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-05
              • 1970-01-01
              相关资源
              最近更新 更多