如何使用onSaveInstanceState()和onRestoreInstanceState()?

时间:2013-05-27 09:00:01

标签: android

我正在尝试跨方向更改保存数据。如下面的代码所示,我使用onSaveInstanceState()onRestoreInstanceState()。我尝试获取保存的值,然后检查onRestoreInstanceState()中的值是否正确。但是当我尝试在onCreate()中使用新值时,我没有新值,而是旧值。

protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("TEXT", user);

    }
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedUser = savedInstanceState.getString("TEXT");
    Log.d("enregistred value", savedUser);

}



public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        int display_mode = getResources().getConfiguration().orientation;

        if (display_mode == 1) {

            setContentView(R.layout.main_grid);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            mGrid.setVisibility(0x00000000);
            // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

        } else {
            setContentView(R.layout.main_grid_land);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            Log.d("Mode", "land");
            // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

        }
        Log.d("savedUser", savedUser);
        if (savedUser.equals("admin")) { //value 0
            adapter.setApps(appManager.getApplications());
        } else if (savedUser.equals("prof")) { //value 1
            adapter.setApps(appManager.getTeacherApplications());
        } else {// default value
            appManager = new ApplicationManager(this, getPackageManager());
            appManager.loadApplications(true);
            bindApplications();
        }
}

3 个答案:

答案 0 :(得分:43)

  

当您的活动在之前被销毁之后重新创建时,您   可以从系统通过的Bundle恢复已保存的状态   你的活动。 onCreate()和onRestoreInstanceState()   回调方法接收包含实例的相同Bundle   国家信息。

     

因为无论系统是否正在创建,都会调用onCreate()方法   您必须在活动的新实例或重新创建前一个实例   在尝试读取之前检查状态Bundle是否为null。   如果为null,则系统正在创建新的实例   活动,而不是恢复之前被破坏的活动。

static final String STATE_USER = "user";
private String mUser;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mUser = savedInstanceState.getString(STATE_USER);
    } else {
        // Probably initialize members with default values for a new instance
        mUser = "NewUser";
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString(STATE_USER, mUser);
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

答案 1 :(得分:17)

  • onSaveInstanceState()是用于在暂停活动之前存储数据的方法。

描述: Hook允许视图生成其内部状态的表示,以后可用于创建具有相同状态的新实例。此状态应仅包含不持久或以后无法重建的信息。例如,您永远不会将当前位置存储在屏幕上,因为当视图的新实例放置在其视图层次结构中时,将再次计算该位置。

  • onRestoreInstanceState()是用于检索该数据的方法。

描述:当从以前保存的状态重新初始化活动时,在onStart()之后调用此方法,此处在savedInstanceState中给出。大多数实现只是使用onCreate(Bundle)来恢复它们的状态,但有时在完成所有初始化之后在此处执行它或者允许子类决定是否使用默认实现。此方法的默认实现执行先前已被onSaveInstanceState(Bundle)冻结的任何视图状态的恢复。

请在此处考虑此示例:
你的应用程序有3个编辑框,用户输入了一些信息,但他接到一个电话,所以如果你没有使用上述方法,他输入的内容将会丢失。
因此,请始终将活动的onPause()方法中的当前数据另存为捆绑&在onResume()方法中调用onRestoreInstanceState()方法。

请参阅:

How to use onSavedInstanceState example please

http://www.how-to-develop-android-apps.com/tag/onrestoreinstancestate/

答案 2 :(得分:9)

这是因为您使用savedValue方法中的onCreate()savedValue已在onRestoreInstanceState()方法中更新,但在onRestoreInstanceState()方法后调用onCreate()。你可以:

  1. 更新savedValue方法中的onCreate()
  2. savedValue方法中移动使用新onRestoreInstanceState()的代码。
  3. 但我建议你使用第一种方法,使代码如下:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        int display_mode = getResources().getConfiguration().orientation;
    
        if (display_mode == 1) {
    
            setContentView(R.layout.main_grid);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            mGrid.setVisibility(0x00000000);
            // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
    
        } else {
            setContentView(R.layout.main_grid_land);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            Log.d("Mode", "land");
            // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
    
        }
        if (savedInstanceState != null) {
            savedUser = savedInstanceState.getString("TEXT");
        } else {
            savedUser = ""
        }
        Log.d("savedUser", savedUser);
        if (savedUser.equals("admin")) { //value 0
            adapter.setApps(appManager.getApplications());
        } else if (savedUser.equals("prof")) { //value 1
            adapter.setApps(appManager.getTeacherApplications());
        } else {// default value
            appManager = new ApplicationManager(this, getPackageManager());
            appManager.loadApplications(true);
            bindApplications();
        }
    }