与生命周期对应关系
各位肯定都知道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
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
操作

- 对
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的使用体验,懒加载注意点;
最后鼓励大家(主要是自己)多看源码,夯实基础,方能不变应万变,本文结束。
最后
Fragment生命周期,一句话形容就是对add、attach`等命令的补充;
其次该功能在官方控件中得以运用,改善了ViewPager+Fragment的使用体验,懒加载注意点;
最后鼓励大家(主要是自己)多看源码,夯实基础,方能不变应万变,本文结束。
本文探讨了Android中Fragment的生命周期控制新方法setMaxLifecycle,分析了它与生命周期状态的关系,以及如何在FragmentPagerAdapter中使用。通过示例展示了如何配合add操作限制Fragment的生命周期状态,提出在最新版FragmentPagerAdapter中解决懒加载的新方案。最后强调了理解源码和巩固基础知识的重要性。
2003





