写点什么

Fragment 新功能,setMaxLifecycle 了解一下,一文详解

用户头像
Android架构
关注
发布于: 刚刚

Lifecycle.State一共有五个状态,最低要求是Lifecycle.State.CREATED,所以该方法可用的参数有CREATEDSTARTEDRESUMEDState生命周期方法有何区别,下面简单解释一下:

生命周期状态理解

在 Fragment 中,定义了五种State,这里的State并非上面说Lifecycle.State,但是逻辑基本上是一致的;


  • INITIALIZING 初始状态

  • CREATED 已创建状态

  • ACTIVITY_CREATED?完全创建,但是没有 started

  • STARTED 创建并启动,可见不可操作

  • RESUMED 创建启动并可操作[图片上传中...(image-1940e7-1557923091355-0)]


<figcaption></figcaption>


本文内容只对CREATEDSTARTEDRESUMED这三个状态讲解,由于 Fragment 中定义的mStateLifecycle.State不是同一状态,在本文视为同一概念;

与生命周期对应关系

各位肯定都知道 Fragment 生命周期有onDestoryonStop等方法,但是状态却没有这么多,那么如何标识状态和对应关系,下面给出对应关系;


首先,我把生命周期方法从onCerate->onCretateView->onStart->onResume->onPause->onStop-> onDestoryView->onDestory视为从小到大排序;


同样的,我们把生命周期状态CREATED->STARTED->RESUMED视为从小到大排序;


  • CREATED状态


CREATED即已创建状态,狭义的理解是生命周期方法走到onCerate,如果当前 fragment 状态已大于CREATED,则会使 fragment 生命周期方法走到onDestoryView,如果小于CREATED,则走到onCerate;所以CREATED有两种情况;


  • STARTED状态


同理,STARTED状态也有两种情况,如果当前 fragment 状态已大于STARTED,则会使 fragment 生命周期方法走到onPause,如果小于CREATED,则走到onStart


  • RESUMED状态


RESUMED表示的状态比较特殊,只代表onResume状态,无论大到小还是小到大,最终都是停留到onResume状态;


以上生命周期状态扭转结论基于FragmentManagerImpl.moveToState()方法提取,如有误导,请指教

如何使用

setMaxLifecycle可以单独使用,也可以配合add等方法组合使用,首先,我们分析单独执行add命令的状态变化:


单独执行 add 操作


FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();fragmentTransaction.add(R.id.frame_layout,cardFragment);fragmentTransaction.commit();



add 配合 setMaxLifecycle(Lifecycle.State.CREATED)


FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();fragmentTransaction.add(R.id.frame_layout,cardFragment);fragmentTransaction.setMaxLifecycle(cardFragment, Lifecycle.State.CREATED);fragmentTransaction.commit();



add 配合 setMaxLifecycle(Lifecycle.State.STARTED)


FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();fragmentTransaction.add(R.id.frame_layout,cardFragment);fragmentTransaction.setMaxLifecycle(cardFragment, Lifecycle.State.STARTED);fragmentTransaction.commit();



add 配合 setMaxLifecycle(Lifecycle.State.RESUMED)


FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();fragmentTransaction.add(R.id.frame_layout,cardFragment);fragmentTransaction.setMaxLifecycle(cardFragment, Lifecycle.State.RESUMED);fragmentTransaction.commit();



单独使用 setMaxLifecycle


FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();fragmentTransaction.setMa


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


xLifecycle(cardFragment, xxx);fragmentTransaction.commit();


  • RESUMED状态的 Fragment 进行操作CREATED操作



  • RESUMED状态的 Fragment 进行操作STARTED操作



  • RESUMED状态的 Fragment 进行操作CREATED操作,在进行STARTED操作



由于篇幅原因,就不一一介绍各种组合情况,只要弄清楚生命周期状态,不论是状态是升还是降,不论组合还是单用,你都可以驾驭;

FragmentPagerAdapter 变动

由于setMaxLifecycle带来了生命周期设置,替换掉了老旧的setUserVisibleHint方法,所以在FragmentPagerAdapter中也进行了适配


FragmentPagerAdapter


public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0;public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1;


private final int mBehavior;


public FragmentPagerAdapter(@NonNull FragmentManager fm) {this(fm, BEHAVIOR_SET_USER_VISIBLE_HINT);}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Fragment新功能,setMaxLifecycle了解一下,一文详解