Fragment调用 setRetainInstance 的原理

Android 如何保持横竖屏切换不变以及Fragment调用setRetainInstance的原理 限定屏幕方向: 设置Manifest文件的activity的属性: android:screenOrientation="portrait"(始终竖屏) landscape(始终横屏) ///////自己处理变更: 设置Manifest文件中的activity属性: android:configChanges="orientation|screenSize|keyboardHidden"视图... 阅读详情

转载自:http://blog.youkuaiyun.com/gaugamela/article https://blog.youkuaiyun.com/Gaugamela/article/details/56280384

Fragment 具有属性 retainInstance ,默认值为 false。
当设备旋转时,fragment 会随托管 activity 一起销毁并重建(重建的时候,是通过反射 fragment 的无参构造函数得到实例存到 FragmentManager 里面的)。

调用 setRetainInstance(true) 方法可保留 fragment,示例代码如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    ...........
}

已保留的 fragment 不会随着 activity 一起被销毁;
相反,它会一直保留(进程不消亡的前提下),并在需要时原封不动地传递给新的 Activity。


保留 Fragment 的原理是:
当设备配置发生变化时,FragmentManager 首先销毁队列中fragment的视图(因为可能有更合适的匹配资源);
紧接着,FragmentManager 将检查每个 fragment 的 retainInstance 属性值。

如果 retainInstance 属性值为 false,FragmentManager 会立即销毁该 fragment 实例。
随后,为适应新的设备配置,新的 Activity 的新的 FragmentManager 会创建一个新的 fragment 及其视图。

如果 retainInstance 属性值为true,则该 fragment 的视图立即被销毁,但 fragment 本身不会被销毁。
为适应新的设备配置,当新的 Activity 创建后,新的 FragmentManager 会找到被保留的 fragment,并重新创建其试图。


虽然保留的 fragment 没有被销毁,但它已脱离消亡中的 activity 并处于保留状态。
尽管此时的 fragment 仍然存在,但已经没有任何 activity 托管它,其生命周期如下图所示:
这里写图片描述


需要说明的是:
只有调用了 fragment 的 setRetainInstance(true) 方法,
并且因设备配置改变,托管 Activity 正在被销毁的条件下,
fragment 才会短暂的处于保留状态。

如果 activity 是因操作系统需要回收内存而被销毁,则所有的 fragment 也会随之销毁。

相对而言,onSaveInstanceState 可以更长久的保持数据。
当Activity所在进程被系统杀死(非用户主动关闭),系统重新创建 activity 时,
将恢复 onSaveInstanceState 中保留的数据。


从上文我们知道,当 Fragment 设置了 setRetainInstance(true) 后,
在设备旋转等情况下,该 Fragment 可以暂时与 Activity 分离。

如果此时 Fragment 持有的后台线程,例如 AsyncTask 中的后台操作等,
需要使用 Fragment 的 Context 等信息,就可能出现错误。

为此,Fragment 中定义了 isAdded 接口,
用于判断 Fragment 是否已经绑定到某个 Activity。

Fragment实用细节技巧 fragment.setRetainInstance(true) from layout 和 add fragment区别 阅读详情

相关推荐

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题

这篇文章解决了在StackOverflow上一个经常被提到的问题。 在配置发生变化(Configuration changs)时,什么是最好的保存活动对象方法,比如运行中的线程,Sockets,AsyncTask。 要回答这个问题,我们要先讨论一些开发者在Activity生命周期中使用长时间后台任务时遇到的共同困难。然后,我们将介绍常见的两种能解决问题但有不好的方法。最后,我们会用一个...

weixin_34007879的博客 449

Ubuntu开机卡在BusyBox?3种方法快速修复initramfs错误(附详细命令)

本文详细介绍了Ubuntu开机卡在BusyBox并出现initramfs错误的3种修复方法,包括使用fsck检查文件系统、调整BIOS/UEFI存储设置以及修改GRUB内核参数。针对常见的文件系统错误和根设备无法找到问题,提供了具体的命令行操作步骤和实用技巧,帮助用户快速恢复系统启动。

milk8的博客 785

Fragment之setRetainInstance详解

Fragment之setRetainInstance详解 对于setRetainInstance()这个方法大多数人还是比较陌生的,之前我也不太理解,只是了解个大概,就是在配置改变时,Fragment不会被重新创建,这里的配置我们就以横竖屏切换为例,这边文章将会带你从源码的角度来分析,基于support-v4-23.1.0,其他版本的原理是一致的,相信看完之后你会对Fragment销毁时的状态的保...

tangedegushi的博客 6888

FastAPI + React:现代 Web 前后端分离开发的全栈实践指南

• 部署:CI/CD 双流水线,前端 push → GitHub Actions → Cloudflare Pages;• 后端:分层结构 routers → services → repositories → models,单测覆盖率 90 %。• 接口缓存:Redis + FastAPI Depends 实现接口级缓存,读 QPS 提升至 5 k。• 前端:BFF 由 React Query 代理,统一缓存、重试、分页。GET /items/{id} 详情。,前端同学无需等 Mock 即可联调。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 1495

医疗影像技术实战:如何用Python快速生成DRR图像(附完整代码)

本文详细介绍了如何使用Python实现数字重建放射影像的快速生成。通过实战代码,从基础光线投射算法到性能优化,逐步讲解DRR图像生成的核心原理与工程实践,帮助开发者掌握医疗影像处理的关键技术,赋能放射治疗规划与图像引导手术等临床工具开发。

k8l9m0n的博客 72

setRetainInstance(true)你知道吗

在Activity中加入一个Fragment,设置一个按钮,切换屏幕 public class SetRetainInstanceAc extends AppCompatActivity { private static final String TAG = "SecondActivity"; private SetRetainInstanceFragment fragment; @Override protected void onCreate(@Nullable B

杨文浩_boke 933

双重机器学习模型中解释变量是连续变量的代码,看到好多都是0/1变量,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 854

android横竖屏切换函数,Android 如何保持横竖屏切换不变以及Fragment调用setRetainInstance的原理...

限定屏幕方向:设置Manifest文件的activity的属性:android:screenOrientation="portrait"(始终竖屏)landscape(始终横屏)///////自己处理变更:设置Manifest文件中的activity属性:android:configChanges="orientation|screenSize|keyboardHidden"视图状态会自动保存(适...

weixin_42204930的博客 267

全志 camera: 4路AHD摄像头转MIPI

TP2815 驱动模块主要实现将 4 路的 AHD/TVI/CVBS Camera 的数据转换为 MIPI 数据,从而实现在 T527 端来对数据进行处理和送显。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 9101

学Simulink——基于高渗透率可再生能源微电网的逆变器系统场景实例:含高比例逆变型电源的微电网暂态稳定性分析

本文详细介绍了基于MATLAB/Simulink的高渗透率可再生能源微电网建模方法,重点分析含高比例逆变型电源的微电网暂态稳定性问题。通过构建包含光伏、风电、逆变器和电网等模块的系统模型,展示了从项目创建、模块搭建到控制策略实现的完整过程。文章特别提供了逆变器PQ控制算法和故障处理逻辑的代码示例,并介绍了仿真参数设置与结果分析方法。该模型能有效评估微电网在故障条件下的动态响应特性,为优化逆变器控制策略提供依据,对现代智能电网研究具有重要意义。

xiaoheshang_123的博客 141

Android技能树 — Fragment总体小结

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

2401_83817916的博客 922

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Fragment调用setRetainInstance的原理

Fragment调用setRetainInstance的原理

橡果生长记的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Activity的内部实例保存-Fragment.setRetainInstance

Fragment的setRetainInstance

jsm1010的博客 379

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

你真的懂 Fragment 吗?—— AndroidX Fragment 核心原理分析

点赞关注,不再迷路,你的支持对我意义重大! ???? Hi,我是丑丑。本文 GitHub · Android-NoteBook 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub) 前言 Fragment 是一个历史悠久的组件,从 API 11 引入至今,已经成为 Android 开发中最常用的组件之一; 在这个专题里,我们将从「使用 & 核心原理 & 面试」三个层面来讨论 Fragment。如果能帮上忙,请务必点

winskyan的专栏 2482

Android 中Fragment的自动重建

Fragment常见的两种重建方式,一种是通过调用setRetainInstance来通知系统在重建Activity(例如屏幕配置改变)时保留此Fragment;另一种方式是系统在重建Activity时自动重建Fragment,典型例子是FragmentActivity对管理的Fragment的重建。 setRetainInstance 直接参考官方文档的解释: Control whether ...

weixin_33953249的博客 3425

savedInstanceState和 fragment.setRetainInstance以及 viewmodel的区别

以默认activity的配置 在屏幕旋转的时候,一般activty都会被重建,以这个情况为例子来说明 Bundle savedInstanceState 和 fragment.setRetainInstance 以及 viewmodel的区别 0. 转载请注明原文出处 作者github :github.com/zjw-swun 欢迎相互关注 1. 为什么要把这3个放在一块说 Bundle s...

weixin_33935777的博客 619

Fragment嵌套坑多多

Android有碎片化的问题,当然本文说的碎片化不是指的系统版本碎片化的问题,而是Fragment组件碎片化的问题。 很久之前,在Android 3.1系统发布的时候,Google推出了使用Fragment来更加容易地开发平板和手机应用,虽然Activity还是页面结构的主体,但是却可以在其基础上使用多个Fragment来构建页面,这些Fragment都是有各自的生命周期的。 最常见的是列表和详情页面使用Fragment,如果在手机设备上,这个两个一般都是在独立的Activity页面中,但是在平板上这两

iblade的博客 722

你真的懂 Fragment 吗?Fragment 的过去、现在和未来~

Fragment 是一个历史悠久的组件,从 API 11 引入至今,已经成为 Android 开发中最常用的组件之一。 在这个专题里,我们将从「使用 & 核心原理 & 面试」三个层面来讨论 Fragment。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。 Fragment 的过去、现在和未来 1.1 Fragment 解决了什么问题?(过去) Fragment 可以将 Activity 视图拆分为多个区块进行模块化地管理 ,避免了 Activity 视图代码过度臃肿混乱。

augfun的博客 621

Fragment相关源码解析二——生命周期

上次说到BackStackRecord的一系列操作其实是在内部形成了一个Op双向链表,commit() 方法调用后被加入到了FragmentManagerImpl的List中,随后会调用BackStackRecord的run()方法。在看这个方法之前我们首先要明确几件事情。Fragment的mState它代表了Fragment的状态,可能被赋值为如下几个值,被初始化的时候默认是INITIALIZIN

chengkun_123的博客 898

Android Fragment核心原理与最佳实践:从生命周期到通信架构

在Android应用开发中,UI组件的模块化与复用是构建复杂界面的关键。Fragment作为Android架构的核心组件,实现了UI的模块化封装,其生命周期管理与宿主Activity紧密耦合又相对独立,通过onCreateView、onViewCreated、onDestroyView等回调形成完整的视图管理循环。理解Fragment的生命周期原理,能有效避免内存泄漏和视图状态异常,这是构建稳定Android应用的基础。在技术价值层面,Fragment支持动态组合与灵活布局,是实现响应式设计、适配多屏幕尺寸

weixin_34417200的博客 540

安卓应用开发中Fragment重叠问题详解及解决方案

摘要: Android开发中Fragment重叠问题表现为多个Fragment界面叠加、事件穿透或返回栈异常,主要由Activity重建时未检查savedInstanceState、重复添加Fragment或状态管理不当导致。解决方案包括:1)在onCreate中检查savedInstanceState避免重复添加;2)添加前通过tag检查Fragment是否存在;3)合理使用commit与commitAllowingStateLoss;4)采用FragmentContainerView或Navigatio

深山技术宅的博客 463

Android 多个Fragment嵌套导致的三大BUG

Android嵌套Fragment三大bug

MegatronKings的博客 2万+

Android Fragment嵌套导致的bug

原文链接http://blog.youkuaiyun.com/megatronkings/article/details/51417510http://www.cnblogs.com/mengdd/p/5552721.htmlAndroid有碎片化的问题,当然本文说的碎片化不是指的系统版本碎片化的问题,而是Fragment组件碎片化的问题。很久之前,在Android 3.1系统发布的时候,Google推出了使用

JackChan 4446
上一篇: Android Studio 的 editor-fold 标签 与 region
下一篇: Android 实现获取原生相册图片和裁剪
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值