说说 Android 碎片 (Fragment) 的生命周期

1 碎片的状态与回调

每个活动在其生命周期内可能会有四种状态:运行、暂停、停止和销毁状态。类似地,每个碎片在其生命周期内也可能会经历这几种状态。

  • 运行状态:当一个碎片是可见时,并且与它关联的活动正处于运行状态时,该碎片也会处于运行状态。
  • 暂停状态:当一个活动进入暂停(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见的碎片就会进入暂停状态。
  • 停止状态:当一个活动进入停止状态,与它相关联的碎片也会进入停止状态。或者通过调用 FragmentTransaction 的 remove()、replace() 方法将碎片从活动中移除,但若在事务提交之前调用 addToBackStack() 方法,这时的碎片也会进入停止状态。总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。
  • 销毁状态:碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片也会进入销毁状态。或者通过调用 FragmentTransaction 的 remove() 、replace() 方法把碎片从活动中移除,但在事务提交之前并没有调用 addToBackStack() 方法的情况下,碎片也会进入销毁状态。

Fragment 类中也提供了一系列的回调方法,用于覆盖碎片生命周期的每个环节。其中,活动中有的回调方法,碎片中几乎都有,除此之外,碎片还提供了一些附加的回调方法:

  • onAttach() - 当碎片和活动建立关联时。
  • onCreateView() - 为碎片创建视图(加载布局)时。
  • onActivityCreated() - 确保与碎片相关联的活动已经创建完毕。
  • onDestroyView() - 当与碎片关联的视图被移除时。
  • onDetach() - 当碎片和活动解除关联时。
说说 Android 碎片 (Fragment) 的生命周期_第1张图片
碎片的生命周期

2 体验碎片生命周期

在前一个 如何使用 Android 的碎片 的项目中,我们来实际体验一下碎片的生命周期吧O(∩_∩)O~

修改 AnotherRightFragment 的代码,在上述的那些回调方法中打印日志:

public class AnotherRightFragment extends Fragment {

    private static final String TAG = "AnotherRightFragment";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView: ");
        return inflater.inflate(R.layout.another_right_fragment, container, false);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d(TAG, "onAttach: ");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, "onActivityCreated: ");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: ");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d(TAG, "onDestroyView: ");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d(TAG, "onDetach: ");
    }
}

当第一次调用 AnotherRightFragment 时,会调用以下方法:

说说 Android 碎片 (Fragment) 的生命周期_第2张图片
第一次调用

点击 Back 键,会调用以下方法:

说说 Android 碎片 (Fragment) 的生命周期_第3张图片
点击 Back 键

现在清楚了吧O(∩_∩)O~

另外,在碎片中可以通过 onSaveInstanceState() 方法来保存数据,这在那些处于停止状态的碎片特别有用,因为它们最有可能会被系统以内存不足的缘由而遭到回收。保存下来的数据在 这些方法 onCreate()、onCreateView() 和 onActivityCreated() 中可以重新获取哦O(∩_∩)O~

你可能感兴趣的:(说说 Android 碎片 (Fragment) 的生命周期)