114

当谈到保存状态时,我很困惑。所以我知道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);
    }
}
4

7 回答 7

201

Bundle是您要保存的所有信息的容器。您使用 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
}

要取回数据,请使用 get* 函数,就像 put* 函数一样。数据存储为名称-值对。这就像一个哈希图。您提供一个键和值,然后当您想要返回值时,您提供键并且函数获取值。这是一个简短的例子。

@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();
    }
}

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

于 2011-06-29T19:00:02.750 回答
34

所有新的 Android 开发人员都应该知道的一个主要注意事项是,只要您为 Widgets(TextView、Buttons 等)分配了 ID,Android 就会自动保留它们中的任何信息。所以这意味着大部分 UI 状态都可以毫无问题地处理。只有当您需要存储其他数据时,这才会成为问题。

来自Android 文档

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

于 2011-06-29T19:07:50.957 回答
7

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

于 2015-03-20T04:48:18.340 回答
5

储存信息:

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 中恢复信息:

以下是示例:重新创建活动

您可以选择实现 onRestoreInstanceState(),而不是在 onCreate() 期间恢复状态,系统在 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);
}
于 2016-12-14T12:48:30.123 回答
0

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

假设您有一个带有 EditText 的活动。用户在其中写了一些文本。之后系统调用您的 onSaveInstanceState()。您从 EditText 读取文本并通过 Bundle.putString("edit_text_value", theValue) 将其写入 Bundle。

现在 onCreate 被调用。您检查提供的捆绑包是否不为空。如果是这种情况,您可以通过 Bundle.getString("edit_text_value") 恢复您的值并将其放回您的 EditText。

于 2011-06-29T18:58:59.513 回答
0

这是为了额外的信息。

想象一下这个场景

  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()。

于 2014-02-04T05:15:18.870 回答
0

如果未从中加载数据,请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
    }
}
于 2016-08-18T11:50:12.343 回答