1、什么是 Lifecycle?
答案
Lifecycle 是 Jetpack 生命周期感知组件,用来感知 Activity、Fragment 的生命周期状态,并把状态分发给观察者,实现业务和页面生命周期解耦。
2、Lifecycle 核心三大角色
答案
- LifecycleOwner:生命周期持有者,Activity、Fragment;
- Lifecycle:生命周期状态管理者;
- LifecycleObserver:生命周期观察者,监听回调。
3、Lifecycle 有哪几种生命周期状态
答案
INITIALIZED、CREATED、STARTED、RESUMED、DESTROYED。
4、Lifecycle 工作原理
答案
Activity/Fragment 内部绑定 Lifecycle;
页面生命周期变化时,Lifecycle 同步更新状态;
观察者通过 addObserver 订阅,自动接收生命周期回调,不用硬写接口。
5、Lifecycle 有什么作用
答案
- 解耦业务代码和 Activity/Fragment 生命周期;
- 自动感知页面前台、后台、销毁;
- 配合
lifecycleScope协程自动取消,防内存泄漏; - 页面销毁自动释放资源、取消网络请求、暂停定时器。
6、Lifecycle 为什么能防内存泄漏
答案
能感知页面销毁时机,观察者收到 DESTROYED 状态后,自动停止任务、释放资源、取消协程和网络请求,避免异步任务持有页面引用造成泄漏。
7、lifecycleScope 和 viewModelScope 区别
答案
- lifecycleScope:绑定 Activity/Fragment 生命周期,页面销毁就取消协程;
- viewModelScope:绑定 ViewModel 生命周期,页面旋转不取消,页面彻底 finish 才取消。
8、LiveData 为什么能感知生命周期?
答案
LiveData 底层依赖 Lifecycle,观察页面状态;
只给 RESUMED 活跃状态 的页面发送数据,页面销毁自动移除观察者,杜绝泄漏和空指针。
9、自己怎么自定义 Lifecycle 观察者?
答案
实现 DefaultLifecycleObserver,重写对应生命周期方法;
通过 lifecycle.addObserver() 绑定,就能自动监听页面生命周期。
10、不用 Lifecycle 有什么弊端
答案
必须在 Activity 各个生命周期方法里手动启停、释放资源;
代码臃肿、耦合高、容易忘记销毁异步任务,极易内存泄漏。
11、Lifecycle 常用业务场景
答案
协程管控、网络请求自动取消、定时器 / 轮询启停、播放器相机资源释放、页面埋点统计、权限弹窗管理、第三方 SDK 生命周期绑定。
内容由豆包 AI 生成,请仔细甄别
Fragment 访问 Activity 级别 ViewModel 数据 面试标准答案
核心一句话
Fragment 和 Activity 共享同一个 ViewModel 实例,Fragment 用所属 Activity 的作用域获取 ViewModel,就能直接拿到 Activity 里的数据。
具体原理
- ViewModel 是按 ViewModelStoreOwner 来隔离实例的;
- 如果 Fragment 获取 ViewModel 时,指定
requireActivity()作为所有者,就会复用 Activity 级别的同一个 ViewModel; - 同一个实例里的数据、LiveData、状态,Fragment 直接可读可观察。
标准写法
1、Activity 里创建
kotlin
val activityVm: MainViewModel by viewModels()
2、Fragment 里获取(关键)
kotlin
val activityVm: MainViewModel by activityViewModels()
activityViewModels() 本质就是以 宿主 Activity 为 ViewModel 持有者,拿到同一份实例。
为什么能共享数据?
- 同一个 ViewModel 实例
- 同一份 LiveData、变量、状态
- Fragment 订阅 LiveData 就能自动收到 Activity 里更新的数据
适用场景
- 多个 Fragment 之间通信;
- Fragment 需要读取 Activity 全局状态;
- 底部 Tab 多个子 Fragment 共享一份业务数据。
注意点
- 不要让 Fragment 直接持有 Activity 引用;
- 全部通过共享 ViewModel + LiveData/Flow 通信,解耦不泄漏;
- 退出 Activity 时,共享 ViewModel 随 Activity 一起销毁,不会内存泄漏。
面试极简口述版
Fragment 想要访问 Activity 的 ViewModel 数据,直接用 activityViewModels() 方式获取,会以宿主 Activity 为生命周期所有者,拿到和 Activity 同一个 ViewModel 实例,从而共享里面所有数据和 LiveData,实现 Fragment 与 Activity、Fragment 与 Fragment 解耦通信。
多个Fragement怎么共享一个ViewModel的数据
多个 Fragment 共享同一个 ViewModel 面试标准答案(极简好背)
核心原理
多个 Fragment 共用宿主 Activity 作为 ViewModel 持有者,拿同一个 ViewModel 实例,就能共享数据。
两种实现方式
方式一:用 activityViewModels ()(最简单)
每个 Fragment 里都这样写:
kotlin
val sharedVm: HomeViewModel by activityViewModels()
- 所有 Fragment 拿到同一个 ViewModel 对象
- 读写同一个变量、观察同一个 LiveData,自动共享数据
方式二:手动指定宿主 Activity
kotlin
val vm = ViewModelProvider(requireActivity())[HomeViewModel::class.java]
效果和 activityViewModels() 完全一样。
为什么能共享
- ViewModel 是按 ViewModelStoreOwner 隔离实例;
- 都以 宿主 Activity 为 Owner,就会拿到同一份 ViewModel;
- 同一份实例里的变量、LiveData、状态全部互通。
通信流程
FragmentA 修改 ViewModel 数据 → ViewModel 里 LiveData 更新 → 其他 Fragment 订阅 LiveData 自动收到变化,实现跨 Fragment 通信。
优点
- 不用接口回调、不用 Fragment 互相持有引用;
- 完全解耦、不会内存泄漏;
- 生命周期自动管理,页面销毁 ViewModel 自动释放。
面试一句话口述
多个 Fragment 通过 activityViewModels 方式获取 ViewModel,统一以宿主 Activity 为生命周期持有者,拿到同一个 ViewModel 实例,通过内部 LiveData 实现数据共享和跨 Fragment 通信,解耦且不会内存泄漏。