使用 onCreate 和 onRestoreInstanceState 的区别

44

在技术上,我是否应该使用onRestoreInstanceState有任何理由呢?我不能通过检查savedInstanceState bundle是否为null并在onCreate中完成所有恢复吗?相较于在onCreate中完成一切,使用onRestoreInstanceState的主要好处是什么?


1
这里已经解释得很清楚了:https://dev59.com/uGcs5IYBdhLWcg3wp1lW#14676555 - Andrew Brooke
@AndrewBrooke 我不理解这句话的意思:“因此,为了最佳实践,请在onCreate中布置您的视图层次结构,并在onRestoreInstanceState中恢复先前的状态。” 这是否意味着只是分配视图(例如通过findViewById),然后在onRestoreInstanceState中分配成员变量? - Sean Hill
3个回答

44

onRestoreInstanceState

当活动从先前保存的状态中重新初始化时,在调用 onStart() 后会调用此方法,并在savedInstanceState中给出。大多数实现将简单地使用 onCreate(Bundle) 来恢复它们的状态,但有时在所有初始化完成后或允许子类决定是否使用您的默认实现后在此处进行恢复更为方便。

onRestoreInstanceState保证您在活动的生命周期中得到一个非空的Bundle对象,它在onStart之后被调用。 但是onCreate:您应该始终检查Bundle对象是否为空来确定配置更改,并且如您所知,它在onStart之前被调用。 因此,完全取决于您的需求和需要。


如果我需要在onCreate中使用我的Activity状态参数怎么办?这并不是罕见的情况。 - Amir Ziarati
@AmirZiarati 你需要检查一下 bundle 对象是否为空,如果不为空,那么你就可以继续了。 - Farshad Tahmasbi
2
我知道,我的意思是:大多数情况下,在onRestoreInstanceState之前我们需要捆绑数据。我认为在onCreate中获取bundle数据更有用且更易读。 - Amir Ziarati
@AmirZiarati 大多数情况下,我们需要知道是否发生了任何配置更改,所以正如我所发布的那样,这完全取决于您的需求,两种方法都可以很好地工作,唯一的区别在于生命周期。 - Farshad Tahmasbi

0

在我看来,我们可以看到这份文档 使用保存的实例状态还原活动 UI 状态

以下是一些要点:

1. onCreate() 和 onRestoreInstanceState() 回调方法都会接收包含实例状态信息的相同 Bundle。

2. 你可以选择在 onRestoreInstanceState() 中实现状态还原,而不是在 onCreate() 中还原。系统会在 onStart() 方法之后调用 onRestoreInstanceState()。系统仅在需要还原保存的状态时才会调用 onRestoreInstanceState(),因此你不需要检查 Bundle 是否为 null:


0

通常我倾向于使用onCreate(Bundle)来恢复活动状态,但如果您在一些初始化之后想要恢复状态,则最好使用onRestoreInstanceState(),它为扩展当前活动的子类提供了更大的灵活性来恢复状态。还要注意的是,onRestoreInstanceState()在onStart()之后调用,而onCreate(bundle)在此之前调用。

如果您有大量数据,可以实现ViewModel类来处理UI控制器逻辑。 ViewModel对象在配置更改期间自动保留,以便它们所持有的数据立即可用于下一个活动或片段实例。例如,如果您需要在应用程序中显示用户列表,请确保将获取和保留用户列表的责任分配给ViewModel,而不是活动或片段。 它还提供了解耦并使您的活动或片段只服务于单一目的,而不是处理过多的UI逻辑责任。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接