Fragment新功能,setMaxLifecycle了解一下

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

  • INITIALIZING 初始状态
  • CREATED 已创建状态
  • ACTIVITY_CREATED 完全创建,但是没有started
  • STARTED 创建并启动,可见不可操作
  • RESUMED 创建启动并可操作[图片上传中…(image-1940e7-1557923091355-0)]

本文内容只对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.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)

总结

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

我搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

img

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

cy8xNjU5NTAzMS1mNDAxOWI3ZTc4Nzc2Y2VhLmpwZw?x-oss-process=image/format,png)

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值