返回

理解 Fragment 的 setRetainInstance(boolean) 在 Activity 重建中的作用

Android

在 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);
    }

    // ... 省略其他代码 ...
}

常见问题解答

  1. 是否会保留视图? 否,视图将重新创建。
  2. 用户离开 Activity 后,Fragment 会被销毁吗? 否,保留的 Fragment 会继续存在。
  3. 为什么不适用于回退栈中的 Fragment? 因为它们是临时存在的。
  4. 何时使用? 存储长期数据、跨 Activity 使用 Fragment 或创建长期服务。
  5. 特点是什么? 保留 Fragment 实例,但不保留视图,onDestroy() 不会被调用。

总结

setRetainInstance() 方法可用于保留 Fragment 实例在 Activity 重建中。它允许存储长期数据、跨 Activity 使用 Fragment 和创建不受 Activity 生命周期影响的服务。了解其局限性(不保留视图、不适用于回退栈中的 Fragment)至关重要。