您的位置:

Android onSaveInstanceState方法详解

一、概述

Android的生命周期中有个方法onSaveInstanceState,它可以在Activity被销毁前保存它的状态,以便再次启动时恢复。onSaveInstanceState方法使用Bundle来保存与Activity相关的状态信息,诸如用户输入等。在Activity重新启动时,可以使用onCreate方法中的Bundle实例恢复状态。如果您想对Activity进行更改而不会丢失状态,则应使用onSaveInstanceState方法。

二、什么时候使用onSaveInstanceState?

在以下情况下使用onSaveInstanceState方法:

  1. 您需要保存临时状态(例如搜索文本框中的内容)。
  2. 您的应用程序需要保存用户输入以进行快速重建。
  3. 当用户旋转设备时, 它可以避免应用程序重新启动。

三、 onSaveInstanceState 方法中需要设置的值

在onSaveInstanceState的方法中,您需要为Bundle对象中的每个值设置一个String键及其对应的值。以下是一些需要在onSaveInstanceState方法中保存的内容:

  1. EditText中的值:在Input Fields中有很多输入文本框,如果用户输入的文本信息需要保存,那么在销毁Activity之前可以把它们的值一一取出保存到onSaveInstanceState方法中。
  2. ScrollView 位置值:如果有一个ScrollView , 那么可以通过getScrollY获取滚动的高度值并且保存.
  3. ListView位置值:如果Activity包含ListView,我们可以使用以下代码在 onSaveInstanceState 方法中保存其状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putIntArray("SCROLL_POSITION",
            new int[]{listView.getFirstVisiblePosition(),
                      listView.getChildAt(0) != null ? listView.getChildAt(0).getTop() : 0});
}

四、onSaveInstanceState 方法如何得到恢复的数据

在恢复状态时,在Activity的onCreate(或onRestoreInstanceState,如果Bundle被传递到该方法)方法中将Bundle作为参数传递。可以使用Bundle中的值和它们的相应键来获取保存的状态。在onCreate方法中,您可以检查Bundle是否为空,并查找与Activity相关的存储的状态信息,例如EditText中设置的文本等。

public class MainActivity extends AppCompatActivity {
 
    private static final String KEY_MESSAGE = "KEY_MESSAGE";
 
    private EditText editText;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        editText = findViewById(R.id.edit_text);
 
        if (savedInstanceState != null) {
            String message = savedInstanceState.getString(KEY_MESSAGE);
 
            if (message != null) {
                editText.setText(message);
            }
        }
    }
 
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(KEY_MESSAGE, editText.getText().toString());
    }
 
}

五、onSaveInstanceState 方法的注意事项

  1. 只能在Bundle中保存基本类型,如int,float,String等。这意味着如果要存储自定义对象,则需要将它们序列化以便存储在Bundle中。
  2. 不要在onSaveInstanceState方法中放太多数据。Bundle实例的大小有限制,过多的数据可能会导致应用程序崩溃。
  3. Bundle是有限制的(一般是 1MB),所以请确保您没有保存太多的信息。

六、总结

onSaveInstanceState方法时Android应用程序中常用的一种技术。将Activity中的状态或数据保存在onSaveInstanceState()方法中,以便在设备重新启动或调用onCreate()方法时能够恢复。