本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

   Android 开发中,Jetpack 组件库极大地提升了开发效率和代码质量。以下为最常用的一些 Jetpack 组件:

组件类别组件名称主要功能
架构组件ViewModel管理界面相关的数据,屏幕旋转时数据不丢失。
LiveData可观察的数据持有者,能感知生命周期,在数据变化时安全地更新UI。
Lifecycle管理 Activity 和 Fragment 的生命周期,方便其他组件进行感知。
Room一个强大的 SQLite 对象映射(ORM)库,简化数据库操作。
后台任务WorkManager管理延迟性且需要可靠运行的后台任务,即使应用退出或设备重启。
界面导航Navigation简化应用内页面导航和跳转逻辑,提供可视化导航图。
异步处理Kotlin 协程与 FlowKotlin 官方的异步编程解决方案,用同步的方式写异步代码

组件使用

1. ViewModel & LiveData

用途:通常将两者结合,用于在配置变更(如屏幕旋转)后依然能保存和管理UI数据,并以生命周期安全的方式通知UI更新。

使用:

  1. 添加依赖:在 app/build.gradle 文件中添加依赖。

dependencies {
    def lifecycle_version = "2.6.2"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}

    2. 创建 ViewModel:继承 ViewModel 类,并在内部使用 LiveData(通常为 MutableLiveData)持有数据。

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // 私有数据,仅在ViewModel内修改
    private val _userName = MutableLiveData<String>()
    // 对外暴露不可变的LiveData,供UI观察
    val userName: LiveData<String> = _userName

    fun updateUserName(newName: String) {
        _userName.value = newName
    }
}

  3. 在 Activity/Fragment 中使用:

class MyActivity : AppCompatActivity() {
    // 方式1:使用委托初始化ViewModel
    private val viewModel: MyViewModel by viewModels()
    // 方式2:传统方式(了解即可)
    private lateinit var viewModel2: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

       // 传统方式初始化
        viewModel2 = ViewModelProvider(this).get(MyViewModel::class.java)


        // 观察LiveData,当数据变化时更新UI
        viewModel.userName.observe(this) { name ->
            // 更新TextView等UI组件
            findViewById<TextView>(R.id.text_view).text = name
        }

        // 触发数据更新
        findViewById<Button>(R.id.button).setOnClickListener {
            viewModel.updateUserName("Hello, Jetpack!")
        }
    }
}

  by viewModels() 的原理

// 这是简写形式
private val viewModel: MyViewModel by viewModels()

// 相当于完整的委托写法
private val viewModel: MyViewModel by lazy {
    ViewModelProvider(this).get(MyViewModel::class.java)
}

为什么用委托?

  • 懒加载:只有在第一次访问时才创建ViewModel

  • 生命周期感知:自动处理配置变化(如屏幕旋转)

  • 代码简洁:避免重复的ViewModelProvider代码

ViewModel的生命周期

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data
    
    init {
        println("ViewModel被创建")
        loadData()
    }
    
    override fun onCleared() {
        super.onCleared()
        println("ViewModel被销毁 - 在这里清理资源")
    }
    
    private fun loadData() {
        // 模拟数据加载
        _data.value = "加载的数据"
    }
}
2. Room 持久化库

用途:在 SQLite 上提供一个抽象层,更方便、更安全地进行本地数据库操作。

使用:
Room 包含三个主要部分:

  • Entity(实体):定义数据库表结构。

  • DAO(数据访问对象):包含用于访问数据库的方法。

  • Database(数据库):持有数据库,并作为访问 DAO 的主要入口。

  1. 添加依赖:

dependencies {
    def room_version = "2.5.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version" // 如果使用Kotlin,使用kapt
    // 可选 - Kotlin 扩展和协程支持
    implementation "androidx.room:room-ktx:$room_version"
}

   2. 定义实体(Entity):

@Entity(tableName = "user")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "age") val age: Int
)

 3. 定义 DAO:

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)

    @Query("SELECT * FROM user")
    fun getAllUsers(): LiveData<List<User>> // 直接返回LiveData,Room支持
}

 4. 定义 Database:

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

 5. 使用:

// 创建数据库实例(通常放在Application类或依赖注入中)
val db = Room.databaseBuilder(
    context.applicationContext,
    AppDatabase::class.java, "database-name"
).build()

// 获取Dao并操作数据
lifecycleScope.launch {
    db.userDao().insert(User(name = "Tom", age = 20))
    // 观察用户列表
    db.userDao().getAllUsers().observe(this@MyActivity) { users ->
        // 更新UI
    }
}
3. WorkManager

用途:处理需要可靠运行的后台任务,例如日志上传、数据同步等,即使应用退出或设备重启。

使用:

  1. 添加依赖:

dependencies {
    def work_version = "2.8.1"
    implementation "androidx.work:work-runtime-ktx:$work_version"
}

 2. 定义后台任务:继承 Worker 类。

class UploadWorker(appContext: Context, params: WorkerParameters) 
    : Worker(appContext, params) {
    
    override fun doWork(): Result {
        // 在这里执行后台任务
        return Result.success() // 返回执行结果
    }
}

 3. 配置并执行任务:

val uploadRequest = OneTimeWorkRequestBuilder<UploadWorker>()
    .setConstraints(
        Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED) // 设置执行条件,例如在连接网络时执行
            .build()
    )
    .build()

WorkManager.getInstance(this).enqueue(uploadRequest)

更多推荐