使用 onCreate 与 onRestoreInstanceState

Posted

技术标签:

【中文标题】使用 onCreate 与 onRestoreInstanceState【英文标题】:Using onCreate vs. onRestoreInstanceState 【发布时间】:2016-07-24 08:32:45 【问题描述】:

在技术上我应该使用onRestoreInstanceState 有什么理由吗?我不能通过检查savedInstanceState 捆绑包是否为空来完成onCreate 中的所有恢复吗?与 onCreate 中的所有操作相比,使用 onRestoreInstanceState 的主要好处是什么?

【问题讨论】:

这里有很好的解释:***.com/a/14676555/2278598 Are onCreate and onRestoreInstanceState mutually exclusive?的可能重复 @Andrew***e 我不明白"So for best practice, lay out your view hierarchy in onCreate and restore the previous state in onRestoreInstanceState" 这条线。这是否意味着只分配视图(例如通过findViewById),然后分配onRestoreInstanceState 中的成员变量? 【参考方案1】:

onRestoreInstanceState

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

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

【讨论】:

如果我需要在 onCreate 中使用我的活动状态参数怎么办?这不是一个罕见的可能性。 @AmirZiarati 您需要检查捆绑对象是否不为空,然后您就可以开始了。 我知道,我的意思是:大多数时候我们需要在 onRestoreInstanceState 之前打包数据。我认为在 onCreate 中获取捆绑数据更有用且更具可读性。 @AmirZiarati 大多数时候我们需要知道是否发生了任何配置更改,所以正如我发布的那样,这完全取决于您的需求,两种方法都可以正常工作,唯一的区别在于生命周期。跨度> 【参考方案2】:

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

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

【讨论】:

【参考方案3】:

在我看来,我们可以看到这个文档Restore activity UI state using saved instance state。

这里有几点

1.onCreate()和onRestoreInstanceState()回调方法都接收到同一个Bundle,其中包含实例状态信息。

2.您可以选择实现 onRestoreInstanceState(),而不是在 onCreate() 期间恢复状态,系统在 onStart() 方法之后调用它。系统只有在有保存状态需要恢复时才会调用onRestoreInstanceState(),所以不需要检查Bundle是否为null:

【讨论】:

以上是关于使用 onCreate 与 onRestoreInstanceState的主要内容,如果未能解决你的问题,请参考以下文章

onCreate 与 onStart 中的 GoogleAPIClient 连接

android中的fragment是先执行oncreate还是oncreateview

Activity的onCreate()的PersistableBundle 参数坑。

OnCreate 未在 Activity 上调用

如何防止片段在活动重新创建时触发 onCreate onCreateView

底部导航栏的 Oncreate 视图问题