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 做生命周期适配。
相关推荐
fengci.1 小时前
CTF+随机困难部分
android·开发语言·网络·安全·php
阿巴斯甜1 小时前
LiveData
android
OCN_Yang2 小时前
Android 开发:XML、Flutter、Compose 怎么选?
android
꯭爿꯭巎꯭2 小时前
壁纸引擎安卓版(wallpaper engine安卓版免费下载)
android
阿巴斯甜2 小时前
viewModel
android
问心无愧05132 小时前
ctf show web 入门39
android·前端·笔记
千里马学框架2 小时前
WMS/AMS深入WindowState如何正确找到自己在层级结构树中位置进行挂载
android·wms·ai编程·性能·系统开发·车载开发·framework工程师
6666v62 小时前
深入 Android 统一状态模型:MVI 架构的核心实现
android·kotlin
Digitally3 小时前
能否通过蓝牙从安卓传输文件到 iPhone?6 种替代方法
android·iphone