【Android组件核心面试题】Fragment add与replace的区别,分别对Fragment的生命周期影响

140 阅读3分钟

Fragment add与replace的区别,分别对Fragment的生命周期影响(美团)

这道题想考察什么?
  1. 是否熟悉add和replace的应用场景
  2. 是否熟悉Fragment的事务操作后的处理流程

考察的知识点

  1. add和replace的应用场景
  2. Fragment事务操作后的处理流程

考生应该如何回答

1、首先我们先从add和replace应用场景出发

当我们对Activity使用事务添加一个Fragment时,有两种方法都可以做到,那就是add和replace。

  • 当前Activity同一个容器只添加一个Fragment时add和replace效果是一样的。
  • 当前Activity添加了一个FragmentA后,在后续某个操作中要将这个FragmentA替换为另外一个FragmentB时,有两种情况:

如果FragmentA是使用add添加的,在将 FragmentA换为 FragmentB时,可以通过hide FragmentA,add FragmentB show FragmentB

如果 FragmentA使用replace操作添加的,在将 FragmentA换为 FragmentB时,使用replace替换

  • 使用 add 添加的 Fragments,可以由开发者自由控制当前应该显示或者隐藏哪个Fragment,其实在源码中就是对应Fragment中View的显示和隐藏。
  • 通过replace 添加的 Fragment,当前已存在的Fragment被替换时走生命周期销毁流程,传递给replace方法的Fragment走生命周期创建流程。

综上所述,我们可以得到一个实例开发中增加Fragment时很重要的一个结论:

  • 当Fragment是不可见时,如果你要保留Fragment中的数据以及View的显示状态,那么可以使用add操作,后续针对不同的状态隐藏和显示不同的Fragment。
  • 优点:快,支持Fragment中View的显示、隐藏
  • 缺点:内存中保留的数据过多,容易导致造成OOM的风险。
  • 当Fragment不可见时,你不需要保留Fragment中的数据和View的显示状态,那么可以使用replace。
  • 优点:节省内存,不需要的数据能立即释放掉
  • 缺点:频繁创建Fragment,也就是频繁走Fragment生命周期创建与销毁流程,造成额外性能开销。

2、然后分别对进行一个add和replace事物操作时,源码中是如何执行的。

要对add、replace事务操作源码中是如何处理的,那么先看下对Fragment事务操作提交流程。

image-20211019164058702

从流程图中发现当执行第10步骤,也就是当调用BackStackRecord#expandOps方法时,对replace操作会进行修改。

总结:

面试官在问add、replace区别,我们可以从实际使用中真实感受出发 即第一点回答,描述完区别后;再来从源码角度说明replace本质是什么内容,replace本质就是将replace操作变为remove、add操作,旧的 Fragment走生命周期销毁流程,新传递的Fragment走生命周期创建流程。

详细关注公众号:Android老皮
还能解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路