首先,关于文档:
public void setRetainInstance (boolean retain)
控制片段实例是否在Activity重新创建(例如从配置更改)时保留。这仅适用于不在后退堆栈中的片段。如果设置了此属性,则当Activity被重新创建时,片段生命周期会略有不同:
- onDestroy()不会被调用(但onDetach()仍会被调用,因为片段正在从其当前活动中分离)。
- onCreate(Bundle)不会被调用,因为片段未被重新创建。
- onAttach(Activity)和onActivityCreated(Bundle)仍将被调用。
我有一些问题:
片段是否也保留其视图,还是会在配置更改时重新创建?“保留”具体意味着什么?
用户离开活动时,片段会被销毁吗?
为什么它不能与后退堆栈中的片段一起使用?
哪些情况下使用这种方法是有意义的?
答案如下:
1. 片段的视图不受保留,会在配置更改时重新创建。保留指的是保留片段实例,以便在Activity重新创建时不会丢失其数据和状态。 2. 不会,只有当Activity被销毁时才会被销毁。 3. 这是因为后退堆栈中的片段可能需要在稍后的时间点进行恢复,而保留片段实例只能用于不在后退堆栈中的片段。 4. 当您有一个非常昂贵的片段(例如包含大量数据或需要长时间进行初始化)并且您希望在Activity重新创建时保留该片段的状态时,可以使用此方法。
Fragment.onDestroy()
会间歇性地被调用,并且在Fragment中由setRetainInstance(true)
保护的字段也会相应地被置空。 - Bad Loser