配置改变时保持状态信息

作者:追风剑情 发布于:2015-7-19 10:38 分类:Android

       当重建一个活动时,活动的当前状态可能会丢失。当终止一个活动时,将触发以下两个方法中的一个或两个:

  • onPause()——当一个活动被终止或转入后台时都会触发这一方法。
  • onSaveInstanceState()——当一个活动将要被终止或转入后台时,也会触发这一方法(正如onPause()方法一样)。然而,与onPause()方法不同的是,当一个活动从栈中卸载时(例如用户按下了Back按钮)不会触发onSaveInstanceState()方法,这是因为后面无须恢复其状态。

      简而言之,要保持一个活动的状态,可以实现onPause()方法,然后使用自己的方法来保存活动状态,如利用数据库、内部或外部的文件存储器等。

如果只是想保存活动状态用来在以后活动重建时(例如当设备方向改变时)进行恢复,那么更简单的方法是实现onSaveInstanceState()方法。这个方法提供了Bundle对象作为一个参数,可以用它保存活动的状态。

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString("ID", "1234567890");//把ID保存起来
    super.onSaveInstanceState(outState);
}

当重建一个活动时,首先触发onCreate()事件,随后是onRestoreInstanceState()方法。此事件可以使您检索先前在onSaveInstanceState方法中通过参数Bundle对象保存的状态:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
   super.onRestoreInstanceState(savedInstanceState);
   String ID = savedInstanceState.getString("ID");
}

尽管可以使用onSaveInstanceState()方法来保存状态信息,但要注意只能通过一个Bundle对象保存信息的局限性。如果需要保存更复杂的数据结构,这就不是一个合适的解决方法。

另一个可以使用的方法是onRetainNonConfigurationInstance()方法。当一个活动由于配置改变(例如屏幕方向的变化、键盘是否可用等)将要被销毁时会触发这一方法。可以通过在该方法中返回来保存当前的数据。

@Override
public Object onRetainNonConfigurationInstance(){
    return ("Some text to preserve");
}
此方法返回一个Object类型,它几乎允许返回任何数据类型。要提取保存的数据,可以使用getLastNonConfigurationInstance()方法在onCreate()方法中进行提取。


代码示例:

  1. package com.example.androidtest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5.  
  6. public class SecondActivity extends Activity {
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_second);
  12. //活动重建时恢复数据,提取onRetainNonConfigurationInstance()返回的数据
  13. String str = (String)getLastNonConfigurationInstance();
  14. }
  15. //方法1: 当活动销毁时保存数据
  1. //(例如屏幕方向的变化、键盘是否可用等)将要被销毁时会触发这一方法。
  2. @Override
  3. public void onSaveInstanceState(Bundle outState) {
  4. outState.putString("ID", "1234567890");
  5. super.onSaveInstanceState(outState);
  6. }
  7. //方法1: 当活动重建时恢复数据
  8. @Override
  9. public void onRestoreInstanceState(Bundle savedInstanceState) {
  10. super.onRestoreInstanceState(savedInstanceState);
  11. String ID = savedInstanceState.getString("ID");
  12. }
  13. //方法2: 当一个活动由于配置改变(例如屏幕方向的变化、键盘是否可用等)
  14. //将要被销毁时会触发这一方法。可以通过在该方法中返回来保存当前的数据。
  15. //此方法返回一个Object类型,它几乎允许返回任何数据类型。要提取保存的数据,
  16. //可以使用getLastNonConfigurationInstance()方法在OnCreate()方法中进行提取。
  17. @Override
  18. public Object onRetainNonConfigurationInstance(){
  19. return ("Some text to preserve");
  20. }
  21. }



标签: Android

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号