返回
理解 Fragment 的 setRetainInstance(boolean) 在 Activity 重建中的作用
Android
2024-04-06 11:03:16
在 Activity 重建中理解 Fragment 的 setRetainInstance(boolean)
作为程序员,我们经常面临 Activity 重建的情况,尤其是在配置更改时。这时,setRetainInstance(boolean)
方法就派上用场了,它能帮我们控制 Fragment 在重建中是否保留。
理解保留的含义
保留 并不意味着保留 Fragment 的视图。视图始终与 Activity 关联,因此在配置更改时仍会重新创建。保留 仅表示 Fragment 实例本身将保留,无需重建。
何时使用 setRetainInstance()
此方法可用于以下场景:
- 存储长期数据: 当 Fragment 管理着复杂数据或状态,且希望在 Activity 重建后依然保留时。
- 跨 Activity 使用 Fragment: 确保 Fragment 实例在多个 Activity 中保持一致。
- 创建长期服务: 构建不受 Activity 生命周期影响的服务或任务。
setRetainInstance() 的特点
- 不会调用
onDestroy()
,但会调用onDetach()
。 onCreate(Bundle)
不会调用,因为 Fragment 不会重新创建。onAttach(Activity)
和onActivityCreated(Bundle)
仍然会被调用。
为何回退栈中的 Fragment 不适用
回退栈中的 Fragment 旨在临时存在,因此不适用于 setRetainInstance()
。当用户在 Activity 中导航时,它们会被销毁并重建。
示例
考虑一个管理用户首选项的 Fragment。使用 setRetainInstance(true)
,即使 Activity 重建,首选项数据也能保留:
public class PreferencesFragment extends Fragment {
private SharedPreferences preferences;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
preferences = getActivity().getSharedPreferences("PreferencesFragment", Context.MODE_PRIVATE);
}
// ... 省略其他代码 ...
}
常见问题解答
- 是否会保留视图? 否,视图将重新创建。
- 用户离开 Activity 后,Fragment 会被销毁吗? 否,保留的 Fragment 会继续存在。
- 为什么不适用于回退栈中的 Fragment? 因为它们是临时存在的。
- 何时使用? 存储长期数据、跨 Activity 使用 Fragment 或创建长期服务。
- 特点是什么? 保留 Fragment 实例,但不保留视图,
onDestroy()
不会被调用。
总结
setRetainInstance()
方法可用于保留 Fragment 实例在 Activity 重建中。它允许存储长期数据、跨 Activity 使用 Fragment 和创建不受 Activity 生命周期影响的服务。了解其局限性(不保留视图、不适用于回退栈中的 Fragment)至关重要。