如何使用onSavedInstanceState的例子

谈到保存状态,我感到困惑。 所以我知道onSaveInstanceState(Bundle)在活动即将被销毁时被调用。 但是,如何在onCreate(Bundle savedInstanceState)存储信息并将其恢复到原始状态? 我不明白这个软件包将如何恢复信息。 如果有人能提供一个例子,这将是有帮助的。 开发指南并没有很好的解释这一点。

 public class Conversation extends Activity { private ProgressDialog progDialog; int typeBar; TextView text1; EditText edit; Button respond; private String name; private String textAtView; private String savedName; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.dorothydialog); text1 = (TextView)findViewById(R.id.dialog); edit = (EditText)findViewById(R.id.repsond); respond = (Button)findViewById(R.id.button01); if(savedInstanceState != null){ savedInstanceState.get(savedName); text1.setText(savedName); } else{ text1.setText("Hello! What is your name?"); respond.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { name = edit.getText().toString(); text1.setText("Nice to meet you "+ name); } }); } } @Override public void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); outState.putString(savedName, name); } } 

Bundle是你想要保存的所有信息的容器。 你使用put *函数来插入数据。 这里有一个简短的列表(还有更多)put函数可以用来在Bundle存储数据。

 putString putBoolean putByte putChar putFloat putLong putShort putParcelable (used for objects but they must implement Parcelable) 

在你的onCreate函数中,这个Bundle被交还给程序。 检查应用程序是重新加载还是首次启动的最佳方法是:

 if (savedInstanceState != null) { // Then the application is being reloaded } 

为了得到数据,像put *函数一样使用get *函数。 数据存储为名称 – 值对。 这就像一个hashmap。 您提供一个键和值,然后当您想要返回值时,您将键和function获取值。 这是一个简短的例子。

 @Override public void onSaveInstanceState(Bundle outState) { outState.putString("message", "This is my message to be reloaded"); super.onSaveInstanceState(outState); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { String message = savedInstanceState.getString("message"); Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } } 

您保存的信息将被烘烤到屏幕上。 希望这可以帮助。

一个主要的注意事项,所有新的Android开发人员应该知道的是,Widgets(TextView,Buttons等)中的任何信息都将由Android自动保存,只要您为其分配一个ID即可。 所以这意味着大部分的用户界面状态都是没有问题的。 只有当您需要存储其他数据时,这会成为一个问题。

从Android文档 :

您唯一需要的工作是为每个要保存其状态的窗口小部件提供唯一的ID(带有android:id属性)。 如果一个小部件没有ID,那么它不能保存它的状态

一个好的信息:你不需要检查Bundle对象是否为onCreate()方法。 使用onStart()方法之后系统调用的onRestoreInstanceState()方法。 只有存在保存的状态才能恢复时,系统会调用onRestoreInstanceState(),所以您不需要检查Bundle是否为null

储存信息:

 static final String PLAYER_SCORE = "playerScore"; static final String PLAYER_LEVEL = "playerLevel"; @Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save the user's current game state savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore); savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); } 

如果你不想在你的onCreate-Method中恢复信息:

这里是例子:重新创build一个活动

在onCreate()期间,您可以select实现onRestoreInstanceState(),而不是在onStart()方法之后调用系统。 只有存在保存的状态才能恢复时,系统会调用onRestoreInstanceState(),所以您不需要检查Bundle是否为null

 public void onRestoreInstanceState(Bundle savedInstanceState) { // Always call the superclass so it can restore the view hierarchy super.onRestoreInstanceState(savedInstanceState); // Restore state members from saved instance mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE); mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL); } 

基本上onSaveInstanceState(Bundle outBundle)会给你一个包。 当你看Bundle类的时候,你会发现你可以在里面放置很多不同的东西。 在onCreate()的下一个调用中,你只需将Bundle作为参数。 然后,您可以再次读取您的值并恢复您的活动。

比方说你有一个EditText的活动。 用户在里面写了一些文字。 之后,系统调用你的onSaveInstanceState()。 您从EditText读取文本,并通过Bundle.putString(“edit_text_value”,theValue)将其写入Bundle。

现在onCreate被调用。 您检查提供的包是否不为空。 如果是这样的话,你可以通过Bundle.getString(“edit_text_value”)恢复你的值,并把它放回到你的EditText中。

这是额外的信息。

想象一下这种情况

  1. ActivityA启动ActivityB。
  2. ActivityB通过启动一个新的ActivityAPrime

     Intent intent = new Intent(getApplicationContext(), ActivityA.class); startActivity(intent); 
  3. ActivityAPrime与ActivityA没有任何关系。
    在这种情况下,ActivityAPrime.onCreate()中的Bundle将为空。

如果ActivityA和ActivityAPrime应该是相同的活动而不是不同的活动,则ActivityB应该调用finish(),而不是使用startActivity()。

如果数据未从savedInstanceState加载, savedInstanceState使用以下代码。
问题是url调用不完全是这样的,检查数据是否加载,然后显示instanceState的值。

 //suppose data is not Loaded to savedInstanceState at 1st swipe if (savedInstanceState == null && !mAlreadyLoaded){ mAlreadyLoaded = true; GetStoryData();//Url Call } else { if (listArray != null) { //Data Array From JsonArray(ListArray) System.out.println("LocalData " + listArray); view.findViewById(R.id.progressBar).setVisibility(View.GONE); }else{ GetStoryData();//Url Call } }