• Android开发 Fragment的生命周期


    前言

      从 https://developer.android.google.cn/guide/components/fragments?hl=zh_cn  拿来的,另外如果从来没接触过Fragment或者对Fragment不甚理解也可以去看看

    生命周期导图

      

    对应生命周期解释

    onAttach

    描述与特性

    1.Activity与Fragment正式关联的生命周期

    建议:

    1.不建议进行耗时资源初始化

    2.在这个生命周期里适合ViewModel的初始化

    3.Activity与Fragment正式关联的生命周期,在此生命周期里最经常处理的操作是取得传入的Bundle值,参考代码如下:

    @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            Bundle bundle = getArguments();
            String content = bundle.getString("content");
        }

    onCreate

    描述与特性:

    1.系统会在创建片段时调用此方法。当片段经历暂停或停止状态继而恢复后,如果您希望保留此片段的基本组件,则应在您的实现savedInstanceState将其初始化。

    2.此生命周期只会在整个Fragment生命周期里只会调用一次

    建议:

    1.不要在此进行耗时资源初始化

    onCreateView

    描述与特性:

    1.创建Fragment的绘制视图界面

    2.此生命周期只会在整个Fragment生命周期里只会调用一次

    建议

    1.系统会在片段首次绘制其界面时调用此方法。如要为您的片段绘制界面,您从此方法中返回的 View 必须是片段布局的根视图。如果片段未提供界面,您可以返回 null。另外此生命周期也是通常是View的控件findViewId的地方,参考代码如下:

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_settings, container, false);
            return view;
        }

    onViewCreated

    描述与特性:

    1.Fragment的绘制视图完成后的生命周期

    2.此生命周期只会在整个Fragment生命周期里只会调用一次

    3.此时视图层次结构尚未附加到其父级。所以View获取的高宽值依然为0.

    建议:

    1.在此处初始化View

        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            Button backBtn = view.findViewById(R.id.back_btn);
        }

     2.将savedInstanceState保存的值重新设置到View中

    onStart

    描述与特性:

    1.此生命周期用户已经可见Fragment,但没有焦点,与用户不能交互。

    2.此生命周期可以被多次调用

    建议:

    1. 开启动画
    2. 一些需要在后台暂停后又重新恢复的初始化,比如一些包含操作View的Handler的重新初始化。
    3. 视频播放与相机拍照等等功能的初始化或者重新初始化(比如:Camera2、VideoView)

    onResume

    描述与特性:

    1.当片段对用户可见并正在运行时调用,并且用户可以交互操作页面。

    2.此生命周期可以被多次调用

    建议:

    1. 在重新运行onResume情况下,可以考虑重新恢复视频播放,注意只是将暂停播放的视频后的重新恢复。并不是重新初始化视频播放组件
    2. 可以考虑Camera预览可以在这里开启。
    3. 在重新运行onResume情况下,恢复Camera预览。
    4. 可以考虑动画在这里开启。
    5. 在重新运行onResume情况下,恢复一些动画View的动画效果。
    6. 在重新运行onResume情况下,恢复需要与操作View有关的Callback或者Listener。
    7. 进行超级耗时的初始化与加载,建议显示一个等待对话框。这样页面已经显示了,用户也能看到等待对话框。(但是,因为onResume容易反复调用需要注意需要利用onRestart生命周期做好判断,防止已经初始化过的资源,进行反复耗时初始化)
    8. 加载耗时的Bitmap资源

    onPause

    描述与特性:

    1.当片段进入后台,用户即将不可见时调用。

    2.注意!onPouse触发时,Fragment可能处于瞬间可见状态,并可以进行焦点操作。

    3.注意!Fragment的onPause不存在Activity那种快速进出只触发onResume与onPause的特性,不会在极快的进出页面操作里从onResume生命周期里返回,它依然会走完整个生命周期一直到onDestroyView触发然后在重新创建View。

    建议:

    1. 暂停视频播放
    2. 暂停摄像拍照预览
    3. 保存一些需要永久保存的UI值。
    4. 保存一些UI的临时值,方便下一次执行onResume的时候恢复显示。比如一些UI单选结果、多选结果,EditText里的内容。
    5. 不能进行耗时操作否则会影响Fragment的退出,出现卡顿

    onStop

    描述与特性:

    1.Fragment已经进入后台时调用,这个时候一瞬间的页面无法操作

    2.在这个生命周期下操作View会报错

    建议:

    1. 假设有Handler需要处理View,那么需要在这个生命周期里移除Handler里的所有待发消息。(handler.removeCallbacksAndMessages(null);)
    2. 暂停动画
    3. 释放Camera2或者Camera的资源。
    4. 释放视频播放VideoView的资源。
    5. 需要耗时释放的资源与后台操作建议放到此处进行。
    6. 不能进行耗时操作否则会影响Fragment的退出,出现卡顿

    onDestroyView

    描述与特性:

    1.视图已经与Fragment分离时调用,如果要恢复这个Fragment的视图,需要重新进入onCreateView。

    建议:

    onDestroy

    描述与特性:

     1.当片段不再使用时调用

    建议:

    1.释放一些耗时资源

    2.设置Handler为null

    3.释放加载过的Bitmap图片资源

    onDetach

    描述与特性:

    1.当前Fragment与Activity分离时调用

    建议:

    常见情况生命周期的执行顺序

    正常的进出Fragment(连Activity一起退出)

    进入: onAttach >> onCreate >> onCreateView >> onViewCreated >> onStart >> onResume
    退出: onPause >> onStop >> onDestroyView >> onDestroy >> onDetach

    按Home键进入后台或者按Power键灭屏

    onPause >> onStop

    从后台返回前台或者Power键亮屏进入前台

    onStart >> onResume

    使用Navigation进入另一个Fragment

    onPause >> onStop >> onDestroyView

    从另外一个Fragment返回

    onCreateView >> onViewCreated >> onStart >> onResume

    在Navigation下使用back键或者navigateUp退出当前Fragment

    onPause >> onStop >> onDestroyView >> onDestroy >> onDetach

  • 相关阅读:
    用Python发生RestFul API POST和GET请求
    C# 8.0中的新功能
    A股数据分析之收集数据:股票列表和股价
    A股数据分析之收集数据:公司详细信息
    VS 2019中修改C#语言版本
    Weak Event Manager
    在WPF中使用MVVM的方式关闭窗口
    C# GDI绘制仪表盘(纯代码实现)
    C#中实现文件拖放打开的方法
    C#设置自定义文件图标实现双击启动
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/12434842.html
Copyright © 2020-2023  润新知