1、什么是 Jetpack Compose?
答案
Jetpack Compose 是 Google 推出的声明式 UI 框架,替代传统 XML 布局;
用 纯 Kotlin 代码 写 UI,无需 XML、不用 findViewById、不用布局嵌套;
专为 Android 设计,原生、简洁、高效、跨版本兼容。
2、声明式 UI vs 命令式 UI 区别
答案
-
传统 XML(命令式)
先布局 XML,再 findViewById,手动一步步修改控件状态,命令控件做什么。
-
Compose(声明式)
只声明当前 UI 应该长什么样,给状态赋值,框架自动刷新 UI;
不用手动操作控件,状态驱动 UI。
一句话:命令式:手动改 UI;声明式:改状态自动刷新 UI。
3、Compose 核心优势
答案
- 抛弃 XML,纯代码写 UI;
- 没有 findViewById、没有布局层级嵌套,渲染更快;
- 状态驱动 UI,数据变 UI 自动变;
- 组件可复用、可组合,函数式编程;
- 原生适配主题、暗黑模式、动画、列表;
- 更少代码、更少 Bug、开发效率高;
- 自带生命周期感知、适配 Jetpack 全家桶。
4、什么是 可组合函数 @Composable
答案
- 标记 @Composable 注解的函数,就是 UI 组件;
- 不用返回 View,直接嵌套调用即可布局;
- 只能在 @Composable 函数里调用;
- 遵循无状态、纯函数特点:输入相同,UI 永远相同。
5、重组 Recomposition 是什么(必问)
答案
重组就是 Compose 局部刷新 UI 的机制:
当组合函数依赖的状态发生变化 时,Compose 只会重新执行受影响的 UI 函数,局部刷新,不是全局重绘。
特点:
- 局部刷新、性能高
- 不确定执行次数,可能多次执行
- 可跳过不变化的组件,智能优化
6、Compose 状态管理有几种方式
答案
- remember :内存临时状态,页面重建会丢失
- rememberSaveable :横竖屏切换、页面重建保留状态
- MutableState / State:可观察状态,变化触发重组
- ViewModel + StateFlow / LiveData:跨生命周期、全局状态、页面共享状态
7、remember 和 rememberSaveable 区别
答案
- remember 只在当前组合内保存,屏幕旋转、页面重建 数据丢失。
- rememberSaveable 自动保存状态,横竖屏、进程重启 依然保留数据,类似 onSaveInstanceState。
8、Compose 如何监听状态变化
答案
依赖 MutableState、State、Flow、LiveData;
只要状态标记为可观察,值一变,自动触发重组刷新 UI,不用手动监听。
9、Compose 生命周期 和 传统 Activity 区别
答案 Compose 自有组件生命周期:
- 进入组合:首次渲染
- 保持组合:UI 保留
- 退出组合:页面销毁、组件移除
可通过 DisposableEffect 监听组件进入 / 退出,做初始化、资源释放、取消协程。
10、Effect 副作用有哪些?各自作用
答案
- LaunchedEffect组合内启动协程、网络请求、延时任务,自动跟随组件生命周期,退出自动取消。
- SideEffect每次重组完成后执行,同步副作用。
- DisposableEffect 组件进入、退出时回调,用来注册监听、解绑释放资源。
- rememberCoroutineScope获取组合协程作用域,在点击事件里启动协程。
1、Compose 列表 LazyColumn / LazyRow 原理
答案
类似 RecyclerView 复用机制;
只渲染屏幕内可见 Item,滑出屏幕自动回收,懒加载、复用 Item,不一次性加载全部布局,性能极高。
12、Compose 能不能混用 传统 View
答案
完全可以。
通过 AndroidView 嵌套原生 XML、自定义 View、第三方控件;
老项目可以逐步迁移,不用一次性全改 Compose。
13、Compose 布局原理 传统 XML 区别
答案
- XML:测量 + 布局 两次遍历,嵌套越多越卡;
- Compose:单次遍历测量布局,无多余嵌套,性能更高;自带约束布局思维,减少层级。
14、Compose 性能优化怎么做
答案
- 拆分小粒度 Composable 函数,缩小重组范围;
- 用 key 稳定列表 Item,避免无效重组;
- 尽量用不可变参数,减少不必要重组;
- 合理使用 remember 缓存计算结果;
- 避免在组合函数里做耗时操作,放到 LaunchedEffect;
- 用 LazyColumn 代替 Column 做长列表。
15、Compose 数据流怎么和 ViewModel 配合
答案
ViewModel 里放 StateFlow / LiveData;
Compose 用 collectAsStateWithLifecycle / observeAsState 转为 UI 可观察状态;状态变化自动重组刷新 UI,完全符合 MVVM。
16、Compose 优缺点总结
答案优点:
- 纯代码 UI,抛弃 XML;
- 声明式、状态驱动,自动刷新;
- 布局层级少,性能更好;
- 组件复用、代码简洁;
- 自带动画、主题、暗黑模式;
- 完美适配 Jetpack、MVVM。
缺点:
- 兼容低版本需要依赖兼容库;
- 第三方部分旧控件适配少;
- 重组机制容易写出无效刷新代码,需要理解原理。