【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用


许多情况下,fragment 的生命周期上限应该低于 FragmentManager/Activity。例如,ViewPager 屏幕外的界面不该被 resumed

理想状况下,可2 a . b – k以通过以下 API 实现

supportFrM + W UagmentManager.beginTo w S ( t 9 (ransj f ; k j Jaction()
.setMaxLifecycle(fragment, Lifecycle.State.RESUMED)
.commZ K m i l Yit()

将最大生命周期设G 6 U l S e置为 Lifecycle.State.RESUMED 将有效地消除约束(因为这是最; D ^ h O & 9 D l高生命周期状况)

这将允许废弃 setUserVisibleHint() API

setMaxLifecycle 呈现始末

该功能应怎么实现的?咱们沿着 commit log 来理一下官方的思路

BackStackRecord 的部分逻辑转移至父类 FragmentTransaction

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

FragmentTransaction 中增加 setMaxLifecycle API

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

保存 fragment mc r A f W R VaxState

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

弃用 setUserVisibleHint

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

FrG } P 6 (agmentPagerAdap* | D 9 P p j Pter 结构器新增参数,运用 setMaxLifecycle() API 确保 fra! M 6 ? 7 # ^ ` Xgment resumed 时对用户可见

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

弃用 FragmentStatePat O agerAdapter 原来的单参结构器,引荐运用新的] ~ M . m )结构

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

跟着 V1 / d L 7iewPager2 1.0.0 正式版发布,与 ViewPager 交互 ) ! 8 #Frm 4 ! _ 7 w k q ?agmentPagerAdapterFragmentStatePagerAdapter 被弃用了

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

至此咱们捋顺了 setMaxLifecycle 的呈现| 3 z k . h J / {setUserVisibleHint 的弃Q ? V i D 8 f x用以及与ViewPager 相关的 Frag? c W , l ZmentPag { ` Y 0 d v 1 rerAdapterFragmentStatePagerAdapter 的弃用

setMaxLifecycle 内部逻辑

接下来咱们看看 setMaxLifecycle 是怎么发挥作用的

首要咱们要研究一下 fragment 的状况办理,为了更好的办理 frG I =aD I 9gment 的状况,官方增加了 Fragm B , A + *mentStateManager 类来专门办理 fragment 的状况,职能单一准则哈

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

接着在该类中增加了核算 fragment 最大生命周期的办法 computeMaxState()* K 1 ` ] J

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

后来该办法改名为 computeExpectedState() 并加入了 moveToExpectedState() 办法

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

cn 5 = xomputeExpectedState() 办法会依据 fragment mMaxD W ( lState 核算 fragment 应该所处的生命周期

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

而 fragment 的 mMaxSta] q z ; a 7 A Cte 是通过 F{ W @ragmentManagersetMaxLifecycle() 办法设置的 ,而该办法是 BackStackRecord 执行 OP 时调用的,而 OP 值正是通过 FragmenY K p k * { &tTransactionse~ ! * : x ) f ]tMaxLifecyk / $ c 7 8 *cle() 设置的

【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用
【Jetpack更新之Fragment】setMaxLifecycle 上位,setUserVisibleHint 被弃用

至此,咱们理清了 setMaxLifecycle() 的内部逻辑

总结

咱们可以看到官方为了使 f* , v B 5 m b p $ragment 可以在正确的生命周期上,引入了 setMaxLifecycle() 办法,一起p j @ t I ( x为了更好的办理 fragment 的状况,笼统出了 FragmentStateManager更少的代码,更少的责任,fr= 5 $agment 的内部逻辑会越来越清晰

  • 关于怎么迁移至 ViewPager2 ,请移步 官方视频

  • 关于新的 API 下懒加载实现,请移步 Androidx 下 Fragment 懒加载的新实现

关于我

我是 Fly_with24

  • 掘金
  • 简书
  • Github

发表评论

提供最优质的资源集合

立即查看 了解详情