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

Ziz*_*zou 51 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();
        }
}
Run Code Online (Sandbox Code Playgroud)

Arv*_*vis 46

在先前销毁活动之后重新创建活动时,您可以从系统传递活动的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);
}
Run Code Online (Sandbox Code Playgroud)

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


Shr*_*ari 18

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

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

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

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

在这里考虑这个例子:
你的应用程序有3个编辑框,用户输入了一些信息,但他接到一个电话,所以如果你没有使用上述方法,他输入的内容将会丢失.
所以总是将当前数据保存在onPause()Activity的方法中作为bundle并在onResume()方法中调用该onRestoreInstanceState()方法.

请参阅 :

请问如何使用onSavedInstanceState示例

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


小智 9

发生这种情况是因为您savedValueonCreate()方法中使用了它.将savedValue在更新onRestoreInstanceState()的方法,但onRestoreInstanceState()在后调用onCreate()方法.你可以:

  1. 更新savedValuein onCreate()方法,或
  2. 移动使用new savedValuein onRestoreInstanceState()方法的代码.

但我建议你使用第一种方法,使代码如下:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)