Lifecycle

1、什么是 Lifecycle?

答案

Lifecycle 是 Jetpack 生命周期感知组件,用来感知 Activity、Fragment 的生命周期状态,并把状态分发给观察者,实现业务和页面生命周期解耦。

2、Lifecycle 核心三大角色

答案

  1. LifecycleOwner:生命周期持有者,Activity、Fragment;
  2. Lifecycle:生命周期状态管理者;
  3. LifecycleObserver:生命周期观察者,监听回调。

3、Lifecycle 有哪几种生命周期状态

答案

INITIALIZED、CREATED、STARTED、RESUMED、DESTROYED。

4、Lifecycle 工作原理

答案

Activity/Fragment 内部绑定 Lifecycle;

页面生命周期变化时,Lifecycle 同步更新状态;

观察者通过 addObserver 订阅,自动接收生命周期回调,不用硬写接口。

5、Lifecycle 有什么作用

答案

  1. 解耦业务代码和 Activity/Fragment 生命周期;
  2. 自动感知页面前台、后台、销毁;
  3. 配合 lifecycleScope 协程自动取消,防内存泄漏
  4. 页面销毁自动释放资源、取消网络请求、暂停定时器。

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 里的数据。

具体原理

  1. ViewModel 是按 ViewModelStoreOwner 来隔离实例的;
  2. 如果 Fragment 获取 ViewModel 时,指定 requireActivity() 作为所有者,就会复用 Activity 级别的同一个 ViewModel
  3. 同一个实例里的数据、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 里更新的数据

适用场景

  1. 多个 Fragment 之间通信;
  2. Fragment 需要读取 Activity 全局状态;
  3. 底部 Tab 多个子 Fragment 共享一份业务数据。

注意点

  1. 不要让 Fragment 直接持有 Activity 引用;
  2. 全部通过共享 ViewModel + LiveData/Flow 通信,解耦不泄漏;
  3. 退出 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() 完全一样。

为什么能共享

  1. ViewModel 是按 ViewModelStoreOwner 隔离实例
  2. 都以 宿主 Activity 为 Owner,就会拿到同一份 ViewModel;
  3. 同一份实例里的变量、LiveData、状态全部互通。

通信流程

FragmentA 修改 ViewModel 数据 → ViewModel 里 LiveData 更新 → 其他 Fragment 订阅 LiveData 自动收到变化,实现跨 Fragment 通信。

优点

  1. 不用接口回调、不用 Fragment 互相持有引用;
  2. 完全解耦、不会内存泄漏;
  3. 生命周期自动管理,页面销毁 ViewModel 自动释放。

面试一句话口述

多个 Fragment 通过 activityViewModels 方式获取 ViewModel,统一以宿主 Activity 为生命周期持有者,拿到同一个 ViewModel 实例,通过内部 LiveData 实现数据共享和跨 Fragment 通信,解耦且不会内存泄漏。

lifeCycle是什么

Lifecycle 面试极简总结(好背、够用)

1、Lifecycle 是什么

Jetpack 生命周期组件,能感知 Activity、Fragment 生命周期变化,把生命周期状态分发出去,给第三方组件监听使用。

2、核心作用

  1. 解耦:不用在 Activity/Fragment 的 onCreate、onStart、onStop 里写一堆业务逻辑;
  2. 生命周期感知:自动监听页面创建、前台、后台、销毁;
  3. 防内存泄漏:页面销毁时自动暂停 / 关闭任务;
  4. 配合 LiveData、ViewModel、协程一起用,适配 Jetpack 整套架构。

3、两大核心类

  • LifecycleOwner:生命周期持有者(Activity、Fragment)
  • LifecycleObserver:生命周期观察者,用来接收回调

4、工作原理

Activity/Fragment 内部持有 Lifecycle;组件(观察者)通过 lifecycle.addObserver() 订阅;页面生命周期变化时,Lifecycle 自动分发给所有观察者,不用自己写接口回调。

5、常用使用场景

  1. 网络请求、协程跟随页面生命周期自动取消;
  2. 播放器、定时器在页面退后台自动暂停,进前台恢复;
  3. 权限申请、埋点统计统一管理生命周期;
  4. 自定义组件解耦,不依赖 Activity 生命周期方法。

6、面试一句话背熟

Lifecycle 是 Jetpack 生命周期感知组件,能让组件自动监听 Activity、Fragment 生命周期,实现业务和页面解耦,自动管理任务启停,有效避免内存泄漏,也是 LiveData、ViewModel 能感知生命周期的底层基础。

Lifecycle 在哪用的

Lifecycle 实际使用场景(面试直接背,全是工作常用)

一、系统 Jetpack 内部在用

  1. LiveData 靠 Lifecycle 感知页面是否在前台,只给活跃页面发数据,页面销毁自动停发,防泄漏。
  2. ViewModel 依靠 Lifecycle 感知页面销毁,配合 viewModelScope 自动取消协程。
  3. DataBinding、WorkManager、Navigation底层都依赖 Lifecycle 做生命周期适配。

二、自己项目开发常用场景

  1. 协程自动管理lifecycleScope,页面销毁自动取消协程,不用手动写取消,杜绝泄漏。

  2. 网络请求封装 网络请求绑定页面生命周期,页面退后台 / 销毁,自动取消请求,避免回调空指针、泄漏。

  3. 定时器、轮询、倒计时 页面进入后台自动暂停,回到前台恢复,页面销毁自动关闭,不用自己在 onStop/onDestroy 手动控制。

  4. 播放器、语音、相机监听生命周期:

    • onPause:自动暂停播放、释放相机
    • onDestroy:资源释放不用在 Activity 重写一堆生命周期方法。
  5. 埋点、统计、页面路由监听 统一监听页面 onCreate、onStart、onStop,集中做页面曝光、停留时长统计,不用每个页面重复写代码。

  6. 权限申请、弹窗管理感知页面状态,只在页面前台时弹框,页面销毁不再回调权限结果。

  7. 自定义第三方 SDK 封装让 SDK 实现 LifecycleObserver,绑定页面生命周期,内部自动启停、释放资源,和 Activity 完全解耦。

面试一句话总结

Lifecycle 主要用在 LiveData/ViewModel 底层依赖、协程生命周期管控、网络请求自动取消、定时器 / 播放器资源自动释放、埋点统计、权限弹窗管理,核心就是解耦业务和页面生命周期,自动管理资源、防止内存泄漏。

Lifecycle 的面试题和答案

Lifecycle 高频面试题 + 精简标准答案(直接背)

1、什么是 Lifecycle?

答案 Lifecycle 是 Jetpack 生命周期感知组件,用来感知 Activity、Fragment 的生命周期状态,并把状态分发给观察者,实现业务和页面生命周期解耦。

2、Lifecycle 核心三大角色

答案

  1. LifecycleOwner:生命周期持有者,Activity、Fragment;
  2. Lifecycle:生命周期状态管理者;
  3. LifecycleObserver:生命周期观察者,监听回调。

3、Lifecycle 有哪几种生命周期状态

答案INITIALIZED、CREATED、STARTED、RESUMED、DESTROYED。

4、Lifecycle 工作原理

答案 Activity/Fragment 内部绑定 Lifecycle;页面生命周期变化时,Lifecycle 同步更新状态;观察者通过 addObserver 订阅,自动接收生命周期回调,不用硬写接口。

5、Lifecycle 有什么作用

答案

  1. 解耦业务代码和 Activity/Fragment 生命周期;
  2. 自动感知页面前台、后台、销毁;
  3. 配合 lifecycleScope 协程自动取消,防内存泄漏
  4. 页面销毁自动释放资源、取消网络请求、暂停定时器。

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 之后

  • AppCompatActivityFragment 内部已经默认实现了 LifecycleOwner 接口 ,源码里自带 LifecycleRegistry,系统帮你自动初始化好了。

2、生命周期自动回调

  • Activity / Fragment 自己的 onCreateonStartonResumeonStoponDestroy内部自动触发 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 内部在用

  1. LiveData 靠 Lifecycle 感知页面是否在前台,只给活跃页面发数据,页面销毁自动停发,防泄漏。
  2. ViewModel 依靠 Lifecycle 感知页面销毁,配合 viewModelScope 自动取消协程。
  3. DataBinding、WorkManager、Navigation底层都依赖 Lifecycle 做生命周期适配。
相关推荐
我命由我123457 小时前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
lilian2338 小时前
Harmony os 技术实战|拼豆制图06:收藏 ID、生成记录与重启恢复怎么不打架
android·java·数据库·harmonyos
2601_955759628 小时前
ClaudeAPI成本中心与业务标签设计指南
android·java·数据库
余衫马8 小时前
2026最新版!Android Studio 极速安装与配置指南
android·ide·android studio
AFinalStone8 小时前
Android 7系统异常问题排查(五)Framework层(下)—System Server崩溃
android·tombstone·系统异常
AFinalStone8 小时前
Android 7系统异常问题排查(八)系统追踪—Trace机制与性能诊断
android·系统异常
极客猴子12 小时前
Android录音转写频繁卡顿?多款APP长时间会议场景稳定性实测
android·人工智能·智能手机·飞书
Kapaseker12 小时前
Boolean 变量到底该怎么命名?
android·kotlin
AFinalStone12 小时前
Android 7系统异常问题排查(六)应用异常(上)—ANR机制全解
android·系统异常
雾屿_Mistisle12 小时前
文件包含漏洞(File Inclusion)
android