Android中Jetpack组件有哪些,它们的作用是什么?
Jetpack核心组件及其作用
Jetpack是Google推出的Android组件库,按架构、UI、基础、行为四类组织,解决三个核心问题:生命周期管理、样板代码、跨版本一致性。
架构组件
ViewModel — 管理UI数据,配置变更时保留。实现原理:ComponentActivity通过onRetainNonConfigurationInstance保存ViewModelStore,重建时恢复。作用域与Lifecycle绑定,Activity finish时自动清理。
kotlinclass MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data }
追问:ViewModel和onSaveInstanceState的区别?——ViewModel存内存中的大对象,onSaveInstanceState存少量可序列化数据到磁盘;ViewModel在进程杀死时丢失,onSaveInstanceState可恢复。
LiveData — 生命周期感知的可观察数据容器。LifecycleBoundObserver在ON_START激活、ON_STOP暂停、ON_DESTROY自动移除,避免泄漏。粘性事件问题:新Observer注册时收到最后一次数据,解法是SingleLiveEvent或迁移到Kotlin Flow。
追问:map和switchMap区别?——map同步转换一対一场景;switchMap异步转换,数据源切换时取消旧观察(如根据输入ID切换查询)。
Room — SQLite抽象层,编译时校验SQL。三要素:Entity映射表、Dao定义操作、Database作入口。支持返回Flow实现实时更新。
kotlin@Entity data class User(@PrimaryKey val id: Int, val name: String) @Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): Flow<List<User>> }
追问:Room迁移怎么做?——Migration定义版本间ALTER语句,addMigrations注册;未覆盖的版本差走fallbackToDestructiveMigration清库。多表查询用@Transaction防数据不一致。
Navigation — 导航图管理Fragment跳转。SafeArgs提供编译时类型安全的参数传递,支持Deep Link。页面重叠用clearBackStack清理无效栈。
WorkManager — 保证执行的后台调度器,API 23+走JobScheduler,以下走AlarmManager+BroadcastReceiver。支持约束条件(网络、电量、存储)和任务链(WorkContinuation串联OneTimeWorkRequest)。
DataBinding — 布局与数据双向绑定。防泄漏:onDestroy中unbind()。优化:复杂逻辑抽到@BindingAdapter,不要在XML写计算。
Hilt — Dagger2的简化封装。@AndroidEntryPoint替代@Component,@HiltViewModel注入ViewModel,预定义Component减少90%模板代码。
Paging 3 — 分页加载库。PagingConfig.prefetchDistance控制预加载距离,PagingDataAdapter自动处理DiffUtil和占位符。
DataStore — 替代SharedPreferences的异步存储。Preferences DataStore存简单键值对,Proto DataStore存类型化对象。基于协程和Flow,避免ANR。
UI组件
Fragment — 模块化UI,与Activity解耦。关键:Fragment生命周期受宿主Activity驱动,onDestroyView和onDestroy在不同场景触发时机不同。
RecyclerView — 四级缓存(Scrap → Cache → ViewCacheExtension → RecycledViewPool),强制ViewHolder模式。与ListView区别:差异化更新、布局管理器解耦、支持多种ItemViewType。
ViewPager2 — 基于RecyclerView,支持垂直和RTL布局,彻底替代ViewPager。
Jetpack Compose — 声明式UI框架,官方推荐方案。核心机制:
- 重组(Recomposition):智能跳过未变化的组合节点,粒度比View的invalidate更细
- 状态提升(State Hoisting):无状态Composable + 状态上移,提升复用性
- 副作用(LaunchedEffect/DisposableEffect):处理非组合逻辑
性能优化:@Stable减少重组范围、LazyColumn延迟加载、remember缓存计算、derivedStateOf避免频繁重组。
追问:remember和rememberSaveable区别?——remember配置变更时丢失,rememberSaveable通过Bundle持久化可恢复。
基础组件
AppCompat — 向后兼容层,Activity需继承AppCompatActivity才能使用Material主题和新属性。
Android KTX — Kotlin扩展集。典型:SharedPreferences.edit { putString() } 替代 commit/apply 样板。
Multidex — 突破65536方法数限制。minSdk 21+由ART原生支持,无需配置。
行为组件
Notifications — Android 13+需POST_NOTIFICATIONS权限。渠道(Channel)机制从Android 8.0开始强制。
Permissions — registerForActivityResult替代onRequestPermissionsResult,类型安全。
Media3 — 统一媒体API,整合ExoPlayer和MediaCompat,推荐迁移。
组件协作:MVVM架构
shellView (Activity/Fragment/Compose) ↓ 观察状态 ViewModel (StateFlow / LiveData) ↓ 调用 Repository (单一数据源) ↓ 获取 Data Source (Room / Retrofit / DataStore)
ViewModel持有UiState,通过StateFlow推送;Repository协调本地和远程数据源;Hilt注入各层依赖;Navigation管理页面流转;DataStore处理偏好设置。这才是Jetpack组件协同工作的完整图景。
面试高频追问
- ViewModelStore何时创建何时销毁?——ComponentActivity首次getViewModelStore时创建,onDestroy且非配置变更时清空
- LiveData粘性事件除SingleLiveEvent外还有什么方案?——Flow的SharedFlow(SharingStarted.WhileSubscribed)天然非粘性
- WorkManager任务链如何处理中间失败?——通过observeForever监听WorkInfo,FAILED状态可链式指定fallback
- Compose重组触发条件?——读取的State变化时触发,未读取该State的部分不重组(智能跳过)
- Hilt的@Singleton作用域绑定在哪?——绑定在ApplicationComponent上,进程级单例;ActivityRetainedComponent对应ViewModel级