Fragment 新功能,setMaxLifecycle 了解一下,一文详解
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.setMa
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);}
评论