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
csharp
val activityVm: MainViewModel by viewModels()
2、Fragment 里获取(关键)
kotlin
csharp
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
csharp
val sharedVm: HomeViewModel by activityViewModels()
- 所有 Fragment 拿到同一个 ViewModel 对象
- 读写同一个变量、观察同一个 LiveData,自动共享数据
方式二:手动指定宿主 Activity
kotlin
scss
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 通信,解耦且不会内存泄漏。
lifeCycle是什么
Lifecycle 面试极简总结(好背、够用)
1、Lifecycle 是什么
Jetpack 生命周期组件,能感知 Activity、Fragment 生命周期变化,把生命周期状态分发出去,给第三方组件监听使用。
2、核心作用
- 解耦:不用在 Activity/Fragment 的 onCreate、onStart、onStop 里写一堆业务逻辑;
- 生命周期感知:自动监听页面创建、前台、后台、销毁;
- 防内存泄漏:页面销毁时自动暂停 / 关闭任务;
- 配合 LiveData、ViewModel、协程一起用,适配 Jetpack 整套架构。
3、两大核心类
- LifecycleOwner:生命周期持有者(Activity、Fragment)
- LifecycleObserver:生命周期观察者,用来接收回调
4、工作原理
Activity/Fragment 内部持有 Lifecycle;组件(观察者)通过 lifecycle.addObserver() 订阅;页面生命周期变化时,Lifecycle 自动分发给所有观察者,不用自己写接口回调。
5、常用使用场景
- 网络请求、协程跟随页面生命周期自动取消;
- 播放器、定时器在页面退后台自动暂停,进前台恢复;
- 权限申请、埋点统计统一管理生命周期;
- 自定义组件解耦,不依赖 Activity 生命周期方法。
6、面试一句话背熟
Lifecycle 是 Jetpack 生命周期感知组件,能让组件自动监听 Activity、Fragment 生命周期,实现业务和页面解耦,自动管理任务启停,有效避免内存泄漏,也是 LiveData、ViewModel 能感知生命周期的底层基础。
Lifecycle 在哪用的
Lifecycle 实际使用场景(面试直接背,全是工作常用)
一、系统 Jetpack 内部在用
- LiveData 靠 Lifecycle 感知页面是否在前台,只给活跃页面发数据,页面销毁自动停发,防泄漏。
- ViewModel 依靠 Lifecycle 感知页面销毁,配合
viewModelScope自动取消协程。 - DataBinding、WorkManager、Navigation底层都依赖 Lifecycle 做生命周期适配。
二、自己项目开发常用场景
-
协程自动管理 用
lifecycleScope,页面销毁自动取消协程,不用手动写取消,杜绝泄漏。 -
网络请求封装 网络请求绑定页面生命周期,页面退后台 / 销毁,自动取消请求,避免回调空指针、泄漏。
-
定时器、轮询、倒计时 页面进入后台自动暂停,回到前台恢复,页面销毁自动关闭,不用自己在
onStop/onDestroy手动控制。 -
播放器、语音、相机监听生命周期:
- onPause:自动暂停播放、释放相机
- onDestroy:资源释放不用在 Activity 重写一堆生命周期方法。
-
埋点、统计、页面路由监听 统一监听页面 onCreate、onStart、onStop,集中做页面曝光、停留时长统计,不用每个页面重复写代码。
-
权限申请、弹窗管理感知页面状态,只在页面前台时弹框,页面销毁不再回调权限结果。
-
自定义第三方 SDK 封装让 SDK 实现 LifecycleObserver,绑定页面生命周期,内部自动启停、释放资源,和 Activity 完全解耦。
面试一句话总结
Lifecycle 主要用在 LiveData/ViewModel 底层依赖、协程生命周期管控、网络请求自动取消、定时器 / 播放器资源自动释放、埋点统计、权限弹窗管理,核心就是解耦业务和页面生命周期,自动管理资源、防止内存泄漏。
Lifecycle 的面试题和答案
Lifecycle 高频面试题 + 精简标准答案(直接背)
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 生命周期绑定。
面试一句话总结
Lifecycle 是 Jetpack 生命周期感知组件,通过 Owner、Lifecycle、Observer 三者配合,自动监听页面生命周期;用来解耦业务代码、自动管理协程和网络请求、资源释放,是 LiveData、ViewModel 生命周期感知的底层依赖,核心作用就是解耦 + 防内存泄漏。
12、Activity和Fragment自动初始化了Lifecycle 吗?
1、AndroidX 之后
AppCompatActivity、Fragment内部已经默认实现了 LifecycleOwner 接口 ,源码里自带LifecycleRegistry,系统帮你自动初始化好了。
2、生命周期自动回调
- Activity / Fragment 自己的
onCreate、onStart、onResume、onStop、onDestroy内部自动触发 Lifecycle 状态流转,不用我们手动赋值、不用手动传状态。
3、我们只需要直接用不需要 new Lifecycle,
直接调用:
kotlin
scss
// 绑定生命周期观察者
lifecycle.addObserver(xxxObserver)
// 使用生命周期协程
lifecycleScope.launch {}
AndroidX 的 AppCompatActivity 和 Fragment 默认已经自动实现并初始化了 Lifecycle,内部自带生命周期注册和状态分发,开发者直接用 lifecycle、lifecycleScope 就行,不用手动创建。
12、 什么时候需要自己手动初始化 Lifecycle?
只有自定义非页面类 (自定义 View、普通工具类、自己写的组件)不是 Activity、不是 Fragment,才需要手动实现 LifecycleOwner、自己初始化 LifecycleRegistry。
13、系统 Jetpack 内部在用
- LiveData 靠 Lifecycle 感知页面是否在前台,只给活跃页面发数据,页面销毁自动停发,防泄漏。
- ViewModel 依靠 Lifecycle 感知页面销毁,配合
viewModelScope自动取消协程。 - DataBinding、WorkManager、Navigation底层都依赖 Lifecycle 做生命周期适配。