资讯专栏INFORMATION COLUMN

Fragment新功能,setMaxLifecycle了解一下

233jl / 918人阅读

摘要:前言写上一篇软文时,我发现最新的代码淘汰了方法,转而支持用方法,言外之意是设置最大生命周期,懂行的人应该知道,一直都是无法直接设置生命周期,必须通过方法间接干预,本来就此功能,简单介绍一下的原理和上手效果阅读指南本文基于版本的进行,也是支

前言

写上一篇ViewPager2软文时,我发现最新的Fragment代码淘汰了setUserVisibleHint方法,转而支持用setMaxLifecycle方法,setMaxLifecycle言外之意是设置最大生命周期,懂行的人应该知道,Fragment一直都是无法直接设置生命周期,必须通过addattachremovedetachshowhide方法间接干预,本来就此功能,简单介绍一下setMaxLifecycle的原理和上手效果;

阅读指南:

本文基于androidx 1.1.0-alpha07版本的fragment进行,也是支持setMaxLifecycle的最低版本

本文会根据FragmentPagerAdapter进行setMaxLifecycle示例应用讲解

基本介绍

setMaxLifecycle定义在FragmentTransaction中,和之前的addattachremovedetachshowhide等方法是并列关系;

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中;

state Lifecycle.State枚举类型,该参数的使用条件是至少是Lifecycle.State.CREATED,否则报IllegalArgumentException异常

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

生命周期状态理解

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

INITIALIZING 初始状态

CREATED 已创建状态

ACTIVITY_CREATED 完全创建,但是没有started

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

RESUMED 创建启动并可操作

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

与生命周期对应关系

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

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

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

CREATED状态

CREATED即已创建状态,狭义的理解是生命周期方法走到onCreate,如果当前fragment状态已大于CREATED,则会使fragment生命周期方法走到onDestoryView,如果小于CREATED,则走到onCreate;所以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来控制setUserVisibleHintsetMaxLifecycle二选一的局面; mBehavior在构造方法中指定;

从代码可以看出,用setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED)替代setUserVisibleHint(false),用setMaxLifecycle(fragment, Lifecycle.State.RESUMED)替代setUserVisibleHint(true)

为什么要用Lifecycle.State.STARTED");add+Lifecycle.State.STARTEDattach+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生命周期,一句话形容就是对addattach等命令的补充;

其次该功能在官方控件中得以运用,改善了ViewPager+Fragment的使用体验,懒加载注意点;

最后鼓励大家(主要是自己)多看源码,夯实基础,方能不变应万变,本文结束。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/7279.html

相关文章

  • Android交流会-碎片Fragment,闲聊单位与尺寸

    摘要:有四种状态运行状态,暂停状态,停止状态,销毁状态。静态动态动态加载步骤创建添加的实例获取,调用方法开启事务,调用方法调用方法提交。和之间的通信和之间的通信,的方法来获取相应碎片的实例。 女孩:又周末了哦~ 男孩:那么今日来开个交流会,我们也学一学人家高大尚的大会,自己开一个,广州站,Android开发攻城狮交流会~ 1.Fragment概要: Android从3.0开始引入了Fragme...

    zombieda 评论0 收藏0
  • 【腾讯Bugly干货分享】Android APP 快速 Pad 化实现

    摘要:中都是由来管理的。如果把设计图中的整个页面称为主,用主中一个来管理所有标签栏的显然会引起混乱,那么能否实现每个标签页中都有一个的实例来管理当前标签中所有转换的问题替换成之后,完善模拟的行为。 如何能在最快的时间内,实现一个最新版本 android app 的 pad 化呢?从拿到一个大型手机 app 代码开始开发到第一个其全新 pad 版本的发布,我们用了不到3个月时间给出了一份满意的...

    endless_road 评论0 收藏0
  • 玩转Android- 收藏集 - 掘金

    摘要:附各种权限详细处理掘金前言对于运行时权限的处理方式网上有很多,包括注解,等等。进阶篇显示网页详解掘金概述是用于显示网页的控件。经过调查复杂列表的实现掘金控件从发布以来,目前已经普遍用于项目中,来承载各种列表内容。 美团点评前端无痕埋点实践 - 前端 - 掘金构建一个数据平台,大体上包括数据采集、数据上报、数据存储、数据计算以及数据可视化展示等几个重要的环节。其中,数据采集与上报是整个流...

    Jonathan Shieber 评论0 收藏0
  • Android架构组件官方文档03——ViewModel

    摘要:实现一个架构组件为控制器提供助手类。警告绝不能引用视图,生命周期或可能持有对活动上下文的引用的任何类。的生命周期对象的范围是在获取时传递给的生命周期。此外,这两个必须处理其他尚未创建或可见的场景。 ViewModel概述 ViewModel类旨在以一种有生命周期意识的方式存储和管理与UI相关的数据。ViewModel类允许数据在配置变化(例如屏幕旋转)后存活。注意:要将ViewMode...

    用户83 评论0 收藏0
  • Android Fragment生命周期——多屏幕支持

    摘要:在使用之前,的生命周期是一个需要关心的问题。的生命周期更加复杂,因为它有更多的状态,如图我们来看一下完整的生命周期。在生命周期开始,方法被调用。系统也可能会销毁的视图显示,发生这种情况时方法就被调用了。 在使用Fragment之前,Fragment的生命周期是一个需要关心的问题。目前,要想在Android上开发出一款APP必须得考虑到碎片化的问题,或者说必须考虑多屏幕适配,这是每一个开...

    guqiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<