Android原生开发的主流框架
LiveData 是一种可观察的数据存储器类,具有生命周期感知能力,常用于在数据变化时通知 View(如 Activity 或 Fragment)更新 UI。ViewModel 旨在以生命周期意识的方式存储和管理界面相关的数据,允许数据在配置更改(如屏幕旋转)后继续存在。Room 在 SQLite 上提供了一个抽象层,旨在更轻松地使用数据库,同时保持 SQLite 的强大功能。下的组件由 Goog
高效开发安卓应用,这些框架必不可少
了解安卓原生开发当前的框架选择,能让你更高效地构建应用。下面我将为你梳理主流框架、它们的使用频率及原因,并提供示例代码。
框架概览表
下面表格汇总了当前安卓原生开发中的核心框架和库,帮助你快速了解:
|
框架/组件名称 |
类别 |
使用频率高的重要原因 |
主要用途 |
|---|---|---|---|
| Jetpack Compose |
UI 工具包 |
声明式UI,代码更简洁直观,开发效率高,官方主力推广 |
构建应用界面 |
| ViewModel |
架构组件 |
生命周期感知,屏幕旋转等配置变更时数据不丢失 |
管理界面相关的数据 |
| LiveData |
架构组件 |
生命周期感知,数据变化时自动更新UI,避免内存泄漏 |
持有可观察的数据,在数据变化时通知界面 |
| Room |
持久化库 |
在 SQLite 上提供抽象层,简化数据库操作,编译时检查SQL语句 |
本地数据库操作 |
| ViewBinding |
视图绑定 |
类型安全和空安全,替代 |
更安全高效地替换findViewById |
| Retrofit |
网络库 |
类型安全的HTTP客户端,简化网络请求,与协程/LiveData集成好 |
处理网络请求 |
| Kotlin 协程 |
异步编程 |
用同步方式写异步代码,简化后台任务和主线程更新UI的流程 |
管理后台线程和异步任务 |
认识 Jetpack
安卓原生开发现已高度围绕 Android Jetpack 组件集展开。Jetpack 是一套库、工具和指南,旨在帮助开发者更轻松地编写高质量应用。以上表格中的许多组件都隶属于 Jetpack。
框架详解与代码示例
下面是一些核心框架的详细说明和代码片段。
🧩 Jetpack Compose
Jetpack Compose 是 Android 现代工具包,用于构建原生 UI,它使用 Kotlin 以声明式方式简化并加速 UI 开发。
// 可组合函数注解,用于定义界面元素@Composablefun Greeting(name: String) { // Text 是 Compose 提供的基础文本组件 // modifier 用于修饰组件,这里添加内边距 // style 用于设置文本样式,这里使用 Material 主题中的 h5 样式 Text( text = "Hello, $name!", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.h5 )}
// 一个简单计数器的例子@Composablefun Counter() { // remember 用于在重组中保持状态状态 var count by remember { mutableStateOf(0) } // Button 是 Material Design 按钮 Button(onClick = { count++ }) { Text(text = "Clicked $count times") }}
📊 ViewModel
ViewModel 旨在以生命周期意识的方式存储和管理界面相关的数据,允许数据在配置更改(如屏幕旋转)后继续存在。
// 导入 ViewModel 和 MutableLiveDataimport androidx.lifecycle.ViewModelimport androidx.lifecycle.MutableLiveData
// MyViewModel 类继承自 ViewModelclass MyViewModel : ViewModel() {
// 使用 MutableLiveData 来持有可变的整数类型数据,初始值为0 val number: MutableLiveData<Int> = MutableLiveData(0)
// 增加数字的方法 fun increaseNumber() { number.value = (number.value ?: 0) + 1 }}
在 Activity 或 Fragment 中使用 ViewModel:
// 在 Activity 或 Fragment 中获取 ViewModel// 使用 'by viewModels()' 属性委托来获取 ViewModel 实例private val viewModel: MyViewModel by viewModels()
// 观察 LiveData 数据变化并更新 UIviewModel.number.observe(this) { value -> // 更新 TextView 等组件显示新的数值 binding.textView.text = value.toString()}
// 点击按钮时调用 ViewModel 的方法binding.button.setOnClickListener { viewModel.increaseNumber()}
🔄 LiveData
LiveData 是一种可观察的数据存储器类,具有生命周期感知能力,常用于在数据变化时通知 View(如 Activity 或 Fragment)更新 UI。
// NameViewModel 继承自 ViewModelclass NameViewModel : ViewModel() { // 创建一个可变的 LiveData 对象来存储字符串类型的名字 private val _currentName = MutableLiveData<String>() // 对外暴露一个不可变的 LiveData 对象,以保证数据的封装性 val currentName: LiveData<String> get() = _currentName
// 更新名字的方法 fun updateName(newName: String) { _currentName.value = newName }}
在 Activity 中观察 LiveData:
// 获取 NameViewModel 实例val model: NameViewModel by viewModels()
// 创建观察者来更新 UIval nameObserver = Observer<String> { newName -> // 更新 TextView 的文本 binding.nameTextView.text = newName}
// 观察 LiveData,并关联生命周期的所有者model.currentName.observe(this, nameObserver)
// 触发数据更新(例如在按钮点击时)binding.updateButton.setOnClickListener { model.updateName("John Doe")}
💾 Room
Room 在 SQLite 上提供了一个抽象层,旨在更轻松地使用数据库,同时保持 SQLite 的强大功能。
// 定义一个数据类,表示数据库中的表@Entitydata class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String?)
// 定义一个数据访问对象 (DAO) 接口@Daointerface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User>
@Insert fun insertAll(vararg users: User)
@Delete fun delete(user: User)}
// 定义 RoomDatabase 抽象类@Database(entities = [User::class], version = 1)abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao}
在代码中使用数据库:
// 创建数据库实例val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name").build()
// 获取 Dao 并执行操作val userDao = db.userDao()val users = userDao.getAll() // 注意:通常应在非主线程执行
🌐 Retrofit 与协程
Retrofit 是类型安全的 HTTP 客户端,协程则用于简化异步操作。
// 定义一个 Retrofit 接口服务interface ApiService { @GET("users/{user}") suspend fun getUser(@Path("user") userId: String): User // 使用 suspend 函数支持协程}
// 在 ViewModel 或 Repository 中调用class MyRepository(private val apiService: ApiService) { suspend fun fetchUser(userId: String): User { return apiService.getUser(userId) // 直接以同步方式写异步代码 }}
// 在 ViewModel 中使用协程class UserViewModel(private val myRepository: MyRepository) : ViewModel() { private val _user = MutableLiveData<User>() val user: LiveData<User> = _user
fun loadUser(userId: String) { viewModelScope.launch { // 在 ViewModel 的作用域内启动协程 try { val userData = myRepository.fetchUser(userId) _user.value = userData } catch (e: Exception) { // 处理错误 } } }}
如何选择框架
选择框架时,可以考虑以下几点:
-
项目需求与复杂度:对于大型、复杂的项目,Jetpack 组件(ViewModel, LiveData, Room) 能提供更好的结构和可维护性。对于追求极致开发效率和一致 UI 的项目,Jetpack Compose 是趋势所在。
-
团队熟悉度:如果团队已熟悉 Kotlin 和声明式编程,Compose 和协程上手会更快。若团队来自传统 XML 和 Java 背景,可能需要一个过渡期,ViewBinding 可以作为第一步。
-
官方支持与社区生态:Android Jetpack 下的组件由 Google 官方支持和维护,学习和使用资料丰富,社区活跃,这是它们使用频率极高的关键原因。Retrofit 等优秀的第三方库也与 Jetpack 生态融合得很好。
-
性能要求:对于绝大多数应用,上述框架的性能都已足够优化。在特定场景(如超高性能要求的游戏/直播应用核心模块)可能仍需结合原生模块或更底层的优化。
希望这些信息能帮助你更好地规划你的安卓开发之旅。祝你编码愉快!
有可以补充的,欢迎在评论区留言。
关注我获取更多知识或者投稿


火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)