android 中后台r报错,Android开发 Fragment的生命周期

前言

生命周期导图

0055b89dfd65c150f3f48ed9425a6bde.png

对应生命周期解释

onAttach

描述与特性:

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

建议:

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

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

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

@Overridepublic voidonAttach(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

publicView onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_settings, container, false);returnview;

}

onViewCreated

描述与特性:

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

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

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

建议:

1.在此处初始化View

@Overridepublic voidonViewCreated(@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.此生命周期可以被多次调用

建议:

开启动画

一些需要在后台暂停后又重新恢复的初始化,比如一些包含操作View的Handler的重新初始化。

视频播放与相机拍照等等功能的初始化或者重新初始化(比如:Camera2、VideoView)

onResume

描述与特性:

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

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

建议:

在重新运行onResume情况下,可以考虑重新恢复视频播放,注意只是将暂停播放的视频后的重新恢复。并不是重新初始化视频播放组件

可以考虑Camera预览可以在这里开启。

在重新运行onResume情况下,恢复Camera预览。

可以考虑动画在这里开启。

在重新运行onResume情况下,恢复一些动画View的动画效果。

在重新运行onResume情况下,恢复需要与操作View有关的Callback或者Listener。

进行超级耗时的初始化与加载,建议显示一个等待对话框。这样页面已经显示了,用户也能看到等待对话框。(但是,因为onResume容易反复调用需要注意需要利用onRestart生命周期做好判断,防止已经初始化过的资源,进行反复耗时初始化)

加载耗时的Bitmap资源

onPause

描述与特性:

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

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

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

建议:

暂停视频播放

暂停摄像拍照预览

保存一些需要永久保存的UI值。

保存一些UI的临时值,方便下一次执行onResume的时候恢复显示。比如一些UI单选结果、多选结果,EditText里的内容。

不能进行耗时操作否则会影响Fragment的退出,出现卡顿

onStop

描述与特性:

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

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

建议:

假设有Handler需要处理View,那么需要在这个生命周期里移除Handler里的所有待发消息。(handler.removeCallbacksAndMessages(null);)

暂停动画

释放Camera2或者Camera的资源。

释放视频播放VideoView的资源。

需要耗时释放的资源与后台操作建议放到此处进行。

不能进行耗时操作否则会影响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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值