Fragment新功能,setMaxLifecycle理解一下

前言
看了一篇关于ViewPager2软文后,我发现最新的Fragment代码淘汰了setUserVisibleHint方法,转而支持用setMaxLifecycle方法,setMaxLifecycle言外之意是设置最大生命周期,懂行的人应该知道,Fragment一直都是无法直接设置生命周期,必需通过add、attach、remove、detach、show、hide方法间接干预,原本就此功能,简单详情一下setMaxLifecycle的原理和上手效果;
阅读指南:
- 本文基于
androidx 1.1.0-alpha07版本的fragment进行,也是支持setMaxLifecycle的最低版本 - 本文会根据
FragmentPagerAdapter进行setMaxLifecycle示例应用讲解
基本详情
setMaxLifecycle定义在FragmentTransaction中,和之前的add、attach、remove、detach、show、hide等方法是并列关系;
FragmentTransaction
public FragmentTransaction setMaxLifecycle(@NonNull Fragment fragment, @NonNull Lifecycle.State state) { addOp(new Op(OP_SET_MAX_LIFECYCLE, fragment, state)); return this;}参数解读:
fragment即需要操作的Fragment对象,前提条件是这个fragment必需已经加到FragmentManager中;stateLifecycle.State枚举类型,该参数的使用条件是至少是Lifecycle.State.CREATED,否则报IllegalArgumentException异常
Lifecycle.State一共有五个状态,最低要求是Lifecycle.State.CREATED,所以该方法可用的参数有CREATED、STARTED、RESUMED,State和生命周期方法有何区别,下面简单解释一下:
生命周期状态了解
在Fragment中,定义了五种State,这里的State并非上面说Lifecycle.State,但是逻辑基本上是一致的;
INITIALIZING初始状态CREATED已创立状态ACTIVITY_CREATED?完全创立,但是没有startedSTARTED创立并启动,可见不可操作RESUMED创立启动并可操作[图片上传中…(image-1940e7-1557923091355-0)]<figcaption></figcaption>
本文内容只对CREATED、STARTED、RESUMED这三个状态讲解,因为Fragment中定义的mState和Lifecycle.State不是同一状态,在本文视为同一概念;
与生命周期对应关系
各位一定都知道Fragment生命周期有onDestory,onStop等方法,但是状态却没有这么多,那么如何标识状态和对应关系,下面给出对应关系;
首先,我把生命周期方法从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.setMaxLifecycle(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);}public FragmentPagerAdapter(@NonNull FragmentManager fm,@Behavior int behavior) { mFragmentManager = fm; mBehavior = behavior;}最新的FragmentPagerAdapter用一个mBehavior来控制setUserVisibleHint和setMaxLifecycle二选一的局面; mBehavior在构造方法中指定;

从代码可以看出,用setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED)替代setUserVisibleHint(false),用setMaxLifecycle(fragment, Lifecycle.State.RESUMED)替代setUserVisibleHint(true);
为什么要用Lifecycle.State.STARTED?由于这里本质上用的是add+Lifecycle.State.STARTED和attach+Lifecycle.State.STARTED组合;
最终的结果是不可见的Fragment只会走到生命周期onStart方法,不会走onResume方法;
懒加载新方案
综上,过去使用setUserVisibleHint来控制Fragment懒加载,在最新版的FragmentPagerAdapter里有新思路,可以切换到BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT模式,在FragmentonResume里判断,更符合显示逻辑;
切换到BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT模式,需要调用俩参数的构造方法:
new FragmentPagerAdapter(getSupportFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)总结
破事水了小半天,本文究竟说了什么内容,还是做个总结吧:
首先使用setMaxLifecycle能进一步的控制Fragment生命周期,一句话描述就是对add、attach等命令的补充;
其次该功能在官方控件中得以运用,改善了ViewPager+Fragment的使用体验,懒加载注意点;
最后鼓励大家(主要是自己)多看源码,夯实基础,方能不变应万变,本文结束。
最后
针对Android程序员,我这边给大家整理了少量资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
Android前沿技术大纲

全套体系化高级架构视频

资料领取:点赞+加群免费获取 Android IOC架构设计
加群 Android IOC架构设计领取获取往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起探讨交流处理问题。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Fragment新功能,setMaxLifecycle理解一下