为了账号安全,请及时绑定邮箱和手机立即绑定

理解片段的setRetainInstance(布尔值)

理解片段的setRetainInstance(布尔值)

慕容森 2019-06-24 14:53:58
理解片段的setRetainInstance(布尔值)从文件开始:公共voidsetRetainInstance(布尔保留)控制是否在活动重新创建(例如从配置更改)中保留片段实例。这只能用于后面堆栈中的片段。如果已设置,则在重新创建活动时,片段生命周期将略有不同:将不会调用onDesty()(但onDetach()仍然会调用,因为片段正与其当前活动分离)。onCreate(Bundle)不会被调用,因为片段没有被重新创建。onAttach(活动)和onActivityCreated(Bundle)仍将被调用。我有一些问题:该片段是否也保留其视图,还是会在配置更改时重新创建?“保留”到底是什么意思?当用户离开活动时,碎片会被销毁吗?为什么它不能处理后面堆栈上的片段?在哪些用例中使用此方法是有意义的?
查看完整描述

3 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

首先,看看我的职位保留下来的碎片。也许会有帮助。

现在回答你的问题:

片段是否也保留了它的视点状态,还是会在配置更改时重新创建-究竟“保留”了什么?

是的,Fragment在整个配置更改过程中,将保留其状态。具体而言,“保留”意味着该片段将在配置更改时被销毁。也就是说,Fragment将是留用即使配置更改导致基础Activity被摧毁。

当用户离开活动时,碎片会被销毁吗?

就像ActivityS,Fragment当内存资源不足时,系统可能会销毁s。是否让片段在配置更改中保留它们的实例状态,对系统是否会破坏Fragment一旦你离开Activity..如果你离开Activity(即按HOME按钮)FragmentS可能被销毁,也可能不会被销毁。如果你离开Activity通过按后退按钮(因此,调用finish()并有效地摧毁了Activity),所有ActivityS附FragmentS也将被摧毁。

为什么它不能处理后面堆栈上的片段?

可能有多种原因导致它不受支持,但对我来说最明显的原因是Activity保存对FragmentManager,以及FragmentManager管理后台。也就是说,不管你是否选择保留Fragment不管是不是,Activity(因此FragmentManager)在配置更改时将被销毁。另一个原因是,如果两个保留的片段都保留下来,事情可能会变得棘手。未保留的片段被允许存在于同一堆背上。

在哪些用例中使用此方法是有意义的?

保留的片段对于跨活动实例传播状态信息(特别是线程管理)非常有用。例如,片段可以作为ThreadAsyncTask管理它的运作。看见我的博客有关此主题的更多信息。

一般来说,我会把它和使用onConfigurationChanged带着Activity..不要仅仅因为太懒而不能正确实现/处理方向更改就将其用作绷带。只有在你需要的时候才用。


查看完整回答
反对 回复 2019-06-24
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

setRetaininstance只有当您的activity由于配置更改而销毁和重新创建实例,因为在调用onRetainNonConfigurationInstance..也就是说,如果您旋转设备,保留的碎片将留在那里(它们不会被破坏和重新创建)。但是,当运行时终止活动以回收资源时,什么都不会留下。当你按下后退按钮并退出活动时,一切都被破坏了。

通常我使用这个函数来保存方向更改时间。如果我从服务器下载了一堆位图,每个位图都是1MB,当用户意外地旋转他的设备时,我肯定不想再做所有的下载工作了,所以我创建了一个Fragment拿着我的位图,把它添加到经理那里,然后打电话setRetainInstance,即使屏幕方向发生变化,所有位图仍然存在。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 391 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信