在Activity
生命周期中,我们可以使用onPause()
保存屏幕状态并释放一些资源。另一方面,我们可以使用onResume()
来获取先前保存的状态并重用先前的变量。
那么,为什么我们需要使用onSaveInstanceState()
?
答案 0 :(得分:1)
我了解您的问题。但是,这些方法有不同的建议。 onPause/onResume
和onSaveInstanceState
之间还存在一些需要牢记的区别:
您不需要每次都存储状态
当按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()保存它的状态,否则计时器将重新启动