您的位置:

深入理解onsaveinstancestate

一、什么是onsaveinstancestate

onsaveinstancestate()方法是用于保存fragment或activity的状态,当系统因为内存原因销毁该activity或fragment时,可以通过savedInstanceState获取之前保存的状态,以便于在activity或fragment重建后恢复数据。该方法必须要在activity或fragment销毁之前及时调用,以便于恢复数据的准确性。

二、为什么使用onsaveinstancestate

在用户使用app的过程中,可能会因为一些原因,如内存不足、横竖屏切换等,导致系统销毁当前的activity或fragment。如果没有保存状态,那么用户将会失去当前操作的数据,需要重新开始。使用onsaveinstancestate就能够很好的解决这个问题,当系统销毁之前,保存当前activity或fragment的状态,当重新创建该activity或fragment时,使用savedInstanceState来恢复当前操作的数据,提供更好的用户体验。

三、如何使用onsaveinstancestate

使用onsaveinstancestate需要遵循以下几个步骤:

1、在activity或fragment中重写onsaveinstancestate方法


@Override 
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString(key,value); //保存数据
}

2、在onCreate方法中恢复数据


@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    if(savedInstanceState != null){
        String value = savedInstanceState.getString(key); //获取数据
    }
}

3、需要注意至少要先调用super.onSaveInstanceState方法,否则可能造成数据的丢失。

四、onsaveinstancestate与bundle的区别

onsaveinstancestate方法与bundle都是用于保存状态的工具,但是它们在使用方法和保存状态的范围上有所不同。

onsaveinstancestate方法是activity或fragment提供的一种保存状态的方法,其范围仅限于当前的activity或fragment,而bundle则是一种可以在各个组件及activity之间传递数据的工具。

使用onsaveinstancestate方法时,我们需要在重写方法中写明需要保存的数据和数据的key,而bundle中的数据,可以通过putExtra和getExtra方法来传递和获取。

五、使用onsaveinstancestate的注意事项

1、只有在系统销毁当前activity或fragment时,才会调用onsaveinstancestate方法来保存状态。

2、在使用onsaveinstancestate方法进行保存时,应该考虑到数据的大小,尽量避免保存过多或过大的数据。

3、当使用onsaveinstancestate方法时,系统会将savedInstanceState添加到activity的bundle中,所以如果你的activity或fragment提供了多个bundle,需要指定使用哪个bundle。

4、需要注意,savedInstanceState保存的数据只能在activity或fragment被销毁后恢复,如果使用finish()方法结束activity,则无法恢复其中的数据。

六、示例代码

1、保存数据到savedInstanceState中


@Override 
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString("key","value"); //保存数据
}

2、恢复数据


@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    if(savedInstanceState != null){
        String value = savedInstanceState.getString("key"); //获取数据
    }
}

七、总结

在android开发过程中,使用onsaveinstancestate能够很好的解决因系统销毁导致数据丢失的问题,提供更好的用户体验。在使用时需要注意保存数据的大小和数据的粒度,以避免过多或过大的数据导致性能问题。