5月28日 02:26

Android中Jetpack组件有哪些,它们的作用是什么?

Jetpack核心组件及其作用

Jetpack是Google推出的Android组件库,按架构、UI、基础、行为四类组织,解决三个核心问题:生命周期管理、样板代码、跨版本一致性。

架构组件

ViewModel — 管理UI数据,配置变更时保留。实现原理:ComponentActivity通过onRetainNonConfigurationInstance保存ViewModelStore,重建时恢复。作用域与Lifecycle绑定,Activity finish时自动清理。

kotlin
class 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架构

shell
View (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级
标签:Android