猿问

理解片段的setRetainInstance(布尔值)

理解片段的setRetainInstance(布尔值)

从文件开始:

公共voidsetRetainInstance(布尔保留)

控制是否在活动重新创建(例如从配置更改)中保留片段实例。这只能用于后面堆栈中的片段。如果已设置,则在重新创建活动时,片段生命周期将略有不同:

  • 将不会调用onDesty()(但onDetach()仍然会调用,因为片段正与其当前活动分离)。
  • onCreate(Bundle)不会被调用,因为片段没有被重新创建。
  • onAttach(活动)和onActivityCreated(Bundle)仍将被调用。

我有一些问题:

  • 该片段是否也保留其视图,还是会在配置更改时重新创建?“保留”到底是什么意思?

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

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

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


慕容森
浏览 392回答 3
3回答

守着一只汪

首先,看看我的职位保留下来的碎片。也许会有帮助。现在回答你的问题:片段是否也保留了它的视点状态,还是会在配置更改时重新创建-究竟“保留”了什么?是的,Fragment在整个配置更改过程中,将保留其状态。具体而言,“保留”意味着该片段将不在配置更改时被销毁。也就是说,Fragment将是留用即使配置更改导致基础Activity被摧毁。当用户离开活动时,碎片会被销毁吗?就像ActivityS,Fragment当内存资源不足时,系统可能会销毁s。是否让片段在配置更改中保留它们的实例状态,对系统是否会破坏Fragment一旦你离开Activity..如果你离开Activity(即按HOME按钮)FragmentS可能被销毁,也可能不会被销毁。如果你离开Activity通过按后退按钮(因此,调用finish()并有效地摧毁了Activity),所有ActivityS附FragmentS也将被摧毁。为什么它不能处理后面堆栈上的片段?可能有多种原因导致它不受支持,但对我来说最明显的原因是Activity保存对FragmentManager,以及FragmentManager管理后台。也就是说,不管你是否选择保留Fragment不管是不是,Activity(因此FragmentManager)在配置更改时将被销毁。另一个原因是,如果两个保留的片段都保留下来,事情可能会变得棘手。和未保留的片段被允许存在于同一堆背上。在哪些用例中使用此方法是有意义的?保留的片段对于跨活动实例传播状态信息(特别是线程管理)非常有用。例如,片段可以作为Thread或AsyncTask管理它的运作。看见我的博客有关此主题的更多信息。一般来说,我会把它和使用onConfigurationChanged带着Activity..不要仅仅因为太懒而不能正确实现/处理方向更改就将其用作绷带。只有在你需要的时候才用。

猛跑小猪

setRetaininstance只有当您的activity由于配置更改而销毁和重新创建实例,因为在调用onRetainNonConfigurationInstance..也就是说,如果您旋转设备,保留的碎片将留在那里(它们不会被破坏和重新创建)。但是,当运行时终止活动以回收资源时,什么都不会留下。当你按下后退按钮并退出活动时,一切都被破坏了。通常我使用这个函数来保存方向更改时间。如果我从服务器下载了一堆位图,每个位图都是1MB,当用户意外地旋转他的设备时,我肯定不想再做所有的下载工作了,所以我创建了一个Fragment拿着我的位图,把它添加到经理那里,然后打电话setRetainInstance,即使屏幕方向发生变化,所有位图仍然存在。
随时随地看视频慕课网APP

相关分类

Android
我要回答