Android setMaxLifecycle和BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT浅析

news2025/1/23 4:41:34

前言

最近公司动荡,我在的项目受大环境影响收益每年下滑,可能要领盒饭了,所以最近都在复习相关基础内容,毕竟小脑袋瓜会忘记以前学过的东西。
在ViewPager和Fragment的懒加载中,具体的原理是怎么样的呢?为什么能只执行显示的Fragment的onResume方法?

疑问

借用一篇文章的说明

1.Lifecycle.State.STARTED对应Fragment的STARTED状态,如果当前Fragment状态低于STARTED,那么Fragment的状态会变为STARTED,以当前Fragment状态为CREATED为例,接下来会依次执行onCreateView()、onActivityCreate()和onStart()方法;
2.如果当前Fragment状态高于STARTED,也就是RESUMED,那么Fragment的状态会被强制降为STARTED,接下来会执行onPause()方法。

疑问一:设置STARTED后是否执行onResume?那是否能交互?
疑问二:FragmentPagerAdapter如果设置STARTED的话,就不会执行到onResume方法,懒加载就无法实现,更没有降级一说?

探索

疑问一:

实践是检验最好的结果,
设置CREATE的:只走了onCreate方法,onStart和onResume不触发,fragment也不显示
设置STARTED的话:不执行onResume,但也不影响页面可交互。

前备知识在疑问二有记录

疑问二

原有的懒加载是用 setUserVisibleHint实现,但查看源码已经给设置成@Deprecated
在这里插入图片描述
注释的setMaxLifecycle是什么呢?单看意思就是最大生命周期,就是一个生命周期阻断的作用。
在这里插入图片描述
用法如下

  FragmentTransaction mCurTransaction = getSupportFragmentManager().beginTransaction();
  mCurTransaction.setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED);

其中的入参中LifeCycle.State是个枚举类型,

public enum State {
    DESTROYED,
    INITIALIZED,
    CREATED,

    /**
     * Started state for a LifecycleOwner. For an {@link android.app.Activity}, this state
     * is reached in two cases:
     * <ul>
     *     <li>after {@link android.app.Activity#onStart() onStart} call;
     *     <li><b>right before</b> {@link android.app.Activity#onPause() onPause} call.
     * </ul>
     */
    START,

    /**
     * Resumed state for a LifecycleOwner. For an {@link android.app.Activity}, this state
     * is reached after {@link android.app.Activity#onResume() onResume} is called.
     */
    RESUMED;
}

看注释大概意思是:
START:创建生命周期只会执行到onStart(onResume不执行),之后的都统一是onPause(onStop不执行)。

fragment创建:onAttach->onCreate->onCreateView->onActivityCreate->onStart->onResume
fragment结束:onPause->onStop->onDestoryView->onDestory->onDetach

知道这些我们再看看FragmentPagerAdapter的源码

首先时构造函数
在这里插入图片描述
mBehavior设置为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT才会懒加载

而用到BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT判断只有两个地方:

1.创建Fragment

   @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
      ***省略
    if (fragment != mCurrentPrimaryItem) {
        fragment.setMenuVisibility(false);
        if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {//注意不执行setUserVisibleHint
            mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.STARTED);
        } else {
            fragment.setUserVisibleHint(false);
        }
    }

    return fragment;
}

其实就是BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT的时候设置setMaxLifecycle为Lifecycle.State.STARTED,也就是说ViewPager的所有fragment的生命周期只会走到onStart,那onResumet是何时调用?

2.设置当前fragment

    @Override
    public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        Fragment fragment = (Fragment)object;//即将显示的fragment
        if (fragment != mCurrentPrimaryItem) {//mCurrentPrimaryItem为即将隐藏的fragment
            if (mCurrentPrimaryItem != null) {
                mCurrentPrimaryItem.setMenuVisibility(false);
                if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {//开启懒加载
                    if (mCurTransaction == null) {
                        mCurTransaction = mFragmentManager.beginTransaction();
                    }
                    mCurTransaction.setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED);//设置即将隐藏的fragment为Start状态
                } else {
                    mCurrentPrimaryItem.setUserVisibleHint(false);
                }
            }
            fragment.setMenuVisibility(true);
            if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {//懒加载
                if (mCurTransaction == null) {
                    mCurTransaction = mFragmentManager.beginTransaction();
                }
                //主要标注1
                mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);//设置即将显示的fragemnt为Resume状态
            } else {
                fragment.setUserVisibleHint(true);
            }

            mCurrentPrimaryItem = fragment;//mCurrentPrimaryItem 只有这里赋值 默认为空
        }
    }

代码中会将即将显示的fragment 调用setMaxLifecycle方法设置为 RESUMED,所以即将显示的fragment会调用onResume方法
而上一个显示的Fragmentm(CurrentPrimaryItem设)会置Lifecycle为START,由于之前设置是RESUMED且执行了onResume,超过了START的限制会回退生命周期,并执行onPause方法,然后隐藏当前实例。

生命周期:

首次进入

log: fragment1:onCreate
log: fragment2:onCreate
log: fragment1:onActivityCreated
log: fragment1:onStart
log: fragment2:onActivityCreated
log: fragment2:onStart
log: fragment1:onResume

切换到fragmet2

log: fragment1:onPause
log: fragment2:onResume

home健

log: fragment2:onPause

再次打开app

log: fragment1:onStart
log: fragment2:onStart
log: fragment2:onResume

退出页面

log: fragment1:onPause
log: fragment2:onDestroy
log: fragment2:onDestroy

instantiateItem和setPrimaryItem的调用链是:

ViewPager.setAdapter->setCurrentItemInternal->populate->addNewItem/ mAdapter.setPrimaryItem

总结

疑问一:设置STARTED后是否执行onResume?那是否能交互?
疑问二:FragmentPagerAdapter如果设置STARTED的话,就不会执行到onResume方法,懒加载就无法实现,更没有降级一说?

1、设置STARTED后是不会执行onResume,包括当前要显示的fragment,也不会影响用户交互。
2、FragmentPagerAdapter会先设置MaxLifecycle的状态为STARTED,然后执行setPrimaryItem方法时会将要显示的Fragment设置为RESUMED,故显示的Fragment会执行onResume。最后设置上一个Fragment的状态为STARTSED,并调用其的onPause方法

STARTSED状态说明:after onStart call;right before onPause call

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多联机常见各部件功能及常见机组制冷原理图

一、各部件名称和主要功能 1、压缩机 压缩机根据实际系统需要&#xff0c;调整其转速达到节能目的。 2、压缩机油温加热带 在待机状态下&#xff0c;保证压缩的油温确再启动可靠性。 3、压缩机 排气 感温包 检测压缩机的排气温度&#xff0c;达到控制和保护目的。 4、高压开…

告别手动截图!手把手教您在教程制作中,如何自动生成Windows操作步骤

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 操作演示 📒📝 记录器📝 操作步骤⚓️ 相关链接 ⚓️📖 介绍 📖 🚀 探索Windows的隐藏宝藏 —— 步骤记录器:你的操作,它来记录! 你是否曾经希望有一个助手,能够自动记录下你在电脑上的每一个操作步骤?无论是为…

电机控制系列模块解析(20)—— MTPA

一、MTPA MTPA 是 "Maximum Torque Per Ampere" 的缩写&#xff0c;意为“最大转矩电流比”。在电机控制系统中&#xff0c;特别是永磁同步电机&#xff08;PMSM&#xff09;或其它永磁电机的控制策略中&#xff0c;MTPA 控制旨在实现电机在给定负载条件下&#xff…

24年湖南三支一扶报名流程图及报名照片要求

24湖南三支一扶报名流程图&#xff0c;照片要求☑️ ✔️报名时间&#xff1a;5月15日9:00至5月23日17:00 ✔️报名方式 报考人员登录市州人力资源社会保障局官网、市州人事考试网等查看各地公告&#xff0c;按要求报名。 ✔️报名流程&#xff08;湖南各地市单独报名&…

15.SVG变形 Transform

SVG的transform属性非常强大&#xff0c;它允许你对图形进行平移、缩放、旋转、倾斜等操作。以下是一篇关于SVG图形变形的教程&#xff0c;包括详细的描述和代码示例。 平移(Translate) 平移操作可以将图形从一个位置移动到另一个位置。使用translate(x, y)&#xff0c;其中x和…

【Linux网络编程】传输层中的TCP和UDP(UDP篇)

【Linux网络编程】传输层中的TCP和UDP&#xff08;UDP篇&#xff09; 目录 【Linux网络编程】传输层中的TCP和UDP&#xff08;UDP篇&#xff09;传输层再谈端口端口号范围划分认识知名端口号netstatiostatpidofxargs UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲数据UDP使…

软考笔记随记

原码:(0正1负) 原码是最直观的编码方式,符号位用0表示正数,用1表示负数,其余位表示数值的大小。 例如,+7的原码为00000111,-7的原码为10000111。 原码虽然直观,但直接用于加减运算会导致计算复杂,且0有两种表示(+0和-0),不唯一。 反码: 反码是在原码的基础上得…

PhpStorm 激活

1、更改Hosts文件 Mac文件位置&#xff1a;/etc/host Windows文件位置&#xff1a;C:\Windows\System32\drivers\etc 将 0.0.0.0 www.jetbrains.com 添加到hosts文件末尾。 2、左下角Proxy settings 添加本地80端口代理 附一个激活码 UX394X3HLT-eyJsaWNlbnNlSWQiOiJVWDM…

探索乡村振兴的绿色发展路径:坚持生态优先,推动农业绿色化、循环化、低碳化,构建美丽乡村生态屏障

目录 一、引言 二、乡村振兴与绿色发展的关系 &#xff08;一&#xff09;乡村振兴的内涵 &#xff08;二&#xff09;绿色发展的重要性 三、推动农业绿色化、循环化、低碳化的具体路径 &#xff08;一&#xff09;农业绿色化 &#xff08;二&#xff09;农业循环化 &a…

3D Tiles资源大全

本文汇总整理3D Tiles相关的各种资源&#xff0c;包括查看器、生成器、示例数据集、教程、演示等。 1、3D Tiles特色演示 注意&#xff1a;这些演示是基于 CesiumJS 1.87.1 Release 发布的&#xff0c;其中包括对 3D Tiles Next 扩展的实验性支持。这些演示中显示的大多数功能现…

还在花钱订购SSL证书吗?out啦!

SSL&#xff08;Secure Sockets Layer&#xff09;证书&#xff0c;以及其后续版本TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;扮演了保护用户数据免遭窃听和篡改的核心角色。这些证书能够确保数据在客户端与服务器之间传输时的加密性与完整性&#…

新质生产力之工业互联网产业链

随着全球经济的数字化转型&#xff0c;新基建的概念逐渐成为推动工业发展的关键动力。在这一转型过程中&#xff0c;工业互联网作为新基建的核心组成部分&#xff0c;正逐渐塑造着未来工业的面貌。那么工业互联网产业链是如何构成的&#xff0c;以及它如何成为推动工业4.0和智能…

回收站删除的照片怎么恢复?7个实用方法为你找回照片!

“我刚刚在对电脑上的照片进行清理&#xff0c;不小心错删了一张还需要的照片&#xff0c;但是在使用回收站时&#xff0c;将它删除了&#xff0c;有什么恢复回收站照片的简单方法吗&#xff1f;” 照片是我们生活点滴的见证&#xff0c;无论是外出旅游还是日常琐碎&#xff0c…

Android中使用Palette让你的页面UI优雅起来

文章目录 1. 什么是Palette2. 引入Palette3. 使用 Palette3.1 同步方式3.2 异步方式3.3 获取色调值 4. 举例4.1 布局文件 activity_palette_list.xml ⬇️4.2 Activity&#xff1a;PaletteListActivity⬇️4.3 列表Adapter&#xff1a;PaletteListAdapter ⬇️4.4 列表item布局…

Pure Nature 2 : Meadows

3D风格化自然环境资产 一切都是预制的,随时可以放在场景中。 URP版本已包含! 此包包含: 植被 -Birchs -橡树 -Elms -柳树 -布什 -草地 草、苜蓿、蕨类植物、灌木、各种… -鲜花 小麦、浆果、胡萝卜、雏菊、金雀花、薰衣草、羽扇豆、大麦、各种… -蘑菇 岩石 悬崖 -巨石 - 岩…

linux 查看java线程与linux线程关系

linux 查看占用cpu高的 java 线程 linux 排查cpu占用100%故障 ##java程序 import java.util.Scanner; public class JavaThreadIDName {public static void main(String[] args) {Thread t Thread.currentThread();t.setName("laoyoutiao");System.out.println(&…

环保科普馆如何互动化加深观众环保认知?

如今&#xff0c;多媒体技术的广泛应用&#xff0c;已经为环保、天文、生物等各类主题展厅注入了新的活力&#xff0c;在这些展馆中&#xff0c;它凭借独特的互动体验&#xff0c;以及深入浅出的教育方式&#xff0c;赢得了广大观众的热烈追捧。今天&#xff0c;我们就一同探讨…

绘唐2跟绘唐3有什么区别

绘唐2跟绘唐3有什么区别 这款产品的最大亮点在于其高度精准的语音克隆能力&#xff0c;利用先进的模型&#xff0c;能够捕捉到用户独特的音调、音高和调制方式&#xff0c;使用户能够以前所未有的方式复制和利用自己的声音。仅需10秒钟的录制时间&#xff0c;即可实现声音的克…

spring-boot-starter-mail 定义邮件工具类EmailHelper

注意 想把这个工具类定义成工具类&#xff0c;所以所有的方法都是静态方法&#xff0c;使用的变量处理参数理所当然都是静态变量期初使用的是Autowired 和 Value进行注解&#xff0c;但是这两个注解是依赖于实例&#xff0c;静态方法是不依赖实例的&#xff0c;所以 from 在发送…

24年5月GPT-4o使用教程,一看就会(低配贾维斯?)

一、 GPT-4o 5月13日&#xff0c;GPT-4o发布&#xff0c;听说是低配钢铁侠的贾维斯&#xff1f;赶紧看一下~ 二、什么是GPT-4o GPT-4o&#xff08;“o”代表“omni”&#xff09;是迈向更自然的人机交互的一步——它接受文本、音频、图像和视频的任意组合作为输入&#xff0…