为什么我们需要onSaveInstanceState()?

时间:2019-06-19 14:54:32

标签: android

Activity生命周期中,我们可以使用onPause()保存屏幕状态并释放一些资源。另一方面,我们可以使用onResume()来获取先前保存的状态并重用先前的变量。

那么,为什么我们需要使用onSaveInstanceState()

3 个答案:

答案 0 :(得分:1)

我了解您的问题。但是,这些方法有不同的建议。 onPause/onResumeonSaveInstanceState之间还存在一些需要牢记的区别:

您不需要每次都存储状态

当按Home键或按Back键退出活动时,不会调用

onSavedInstanceState()。另一方面,在这些情况下称为onPause。因此,在onPause期间保存状态是缺乏资源(您在不需要时存储状态)。

onResume运行太晚了

onResume()在您的活动已经准备好向用户显示之后被调用(因为在onStart和onCreate之后调用了它)。因此,在onResume期间恢复视图状态并不是一个好主意,因为它已经太迟了...

onCreate期间,您已经可以访问先前保存的Bundle。因此,您可以在onCreate内决定是设置默认内容还是恢复旧存储的数据。 您可以在视图甚至不可见之前对其进行更新。用户不会注意到更改。

如果您在onResume期间恢复状态,则该视图已经创建,并且可能已经对用户可见。因此,他会注意到正在使用默认内容重新创建屏幕,然后慢慢更改为旧存储的内容。

onResume期间更新视图状态可以使屏幕闪烁

onSavedInstanceState()允许您将所需的信息存储在Bundle中。然后,在onCreate期间,您已经可以访问该捆绑软件并使用适当的内容“创建”屏幕。在内容对用户可见之前。

如果您尝试在onResume期间恢复整个屏幕状态,则会注意到屏幕闪烁。之所以会这样,是因为整个屏幕是在onCreate期间创建的,后来又在onResume期间进行了更新。即使您没有更改内容,也是如此。

这些是我看到您确实应该使用onSaveInstanceState存储视图状态的一些原因。

答案 1 :(得分:0)

onSaveInstanceState()被自动调用,这不是典型(常规流程)活动生命周期的一部分。当您的应用程序处于后台并且操作系统需要终止您的应用程序以释放一些内存时,操作系统会自动调用此方法。并且您还会收到一个Bundle对象,可以将重要数据放入该捆绑包中。当用户从后台恢复您的应用时,您会以OnCreate()的方式收到该捆绑软件。

您可以进一步了解here

Android示例

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
// ...


@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, currentScore);
    savedInstanceState.putInt(STATE_LEVEL, currentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

现在,在OnCreate方法中,您将收到该捆绑包

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        currentScore = savedInstanceState.getInt(STATE_SCORE);
        currentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    // ...
}

答案 2 :(得分:0)

onSaveInstanceState()是一个在生命周期中被调用的函数。 最常见的示例是旋转屏幕且活动被销毁并在保存实例上重新创建时被调用。 调用该方法时,您可以将值(键值格式)插入到包中,然后按原样还原活动。

例如,如果我的计时器关闭并且旋转手机,则将重新创建屏幕,并且除非我使用onSaveInstaceState()保存它的状态,否则计时器将重新启动