如何使用onSaveInstanceState()和onRestoreInstanceState()?
我正在尝试在方向更改中保存数据。 如下面的代码所示,我使用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(); } }
当您的活动在之前被破坏之后被重新创build时,您可以从系统通过您的活动的Bundle中恢复已保存的状态。 onCreate()和onRestoreInstanceState()callback方法都会收到包含实例状态信息的Bundle。
因为无论系统是创build一个新的活动实例还是重新创build一个活动,都会调用onCreate()方法,所以在尝试读取之前,必须检查状态Bundle是否为null。 如果它为空,那么系统正在创build一个活动的新实例,而不是恢复之前被销毁的实例。
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
-
onSaveInstanceState()
是暂停活动前用于存储数据的一种方法。
说明: Hook允许视图生成其内部状态的表示,稍后可用于创build具有相同状态的新实例。 这个状态应该只包含不持久或以后不能重build的信息。 例如,您不会将当前位置存储在屏幕上,因为当视图的新实例放置在其视图层次结构中时,会再次计算该位置。
-
onRestoreInstanceState()
是用来检索数据的方法。
说明:当onStart()从以前保存的状态重新初始化活动时调用此方法,此处已在savedInstanceState中给出。 大多数实现只是简单地使用onCreate(Bundle)来恢复它们的状态,但是在完成所有的初始化或者允许子类决定是否使用你的默认实现之后,这样做有时候会很方便。 此方法的默认实现会执行之前由onSaveInstanceState(Bundle)冻结的任何视图状态的还原。
考虑这个例子:
你的应用程序有3个编辑框,其中用户在某些信息,但他接到一个电话,所以如果你不使用上述方法,他所input的全部将丢失。
所以总是将当前数据保存在Activity的onPause()
方法中,作为一个bundle&in的onResume()
方法调用onRestoreInstanceState()
方法。
请参见 :
如何使用onSavedInstanceState的例子
http://www.how-to-develop-android-apps.com/tag/onrestoreinstancestate/
发生这种情况是因为在onCreate()
方法中使用了savedValue
。 savedValue
在onRestoreInstanceState()
方法中更新,但在onCreate()
方法之后调用onRestoreInstanceState()
。 你可以:
- 在
onCreate()
方法或者更新savedValue
- 在
onRestoreInstanceState()
方法中移动使用新的savedValue
的代码。
但我build议你使用第一种方法,使代码如下所示:
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(); } }