Jetpack概述 #

一、Jetpack简介 #

Jetpack是Google推出的一套Android开发组件库,包含了一系列库、工具和架构指南,帮助开发者快速构建高质量应用。

1.1 Jetpack的优势 #

  • 减少样板代码
  • 提供最佳实践
  • 向后兼容
  • 减少崩溃
  • 提高代码质量

1.2 Jetpack组件分类 #

text
Jetpack
├── 架构组件 (Architecture Components)
│   ├── ViewModel
│   ├── LiveData
│   ├── Room
│   ├── Navigation
│   ├── DataBinding
│   ├── WorkManager
│   └── Paging
├── 基础组件 (Foundation Components)
│   ├── AppCompat
│   ├── Android KTX
│   └── Test
├── 行为组件 (Behavior Components)
│   ├── Notifications
│   ├── Permissions
│   └── Sharing
└── 界面组件 (UI Components)
    ├── Animation
    ├── Emoji
    ├── Fragment
    └── Layout

二、架构组件 #

2.1 ViewModel #

ViewModel用于存储和管理UI相关数据,在配置更改时数据不会丢失。

kotlin
class MainViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data
    
    fun updateData(newData: String) {
        _data.value = newData
    }
}

2.2 LiveData #

LiveData是一种可观察的数据存储器,具有生命周期感知能力。

kotlin
class MainViewModel : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users
    
    fun loadUsers() {
        viewModelScope.launch {
            _users.value = repository.getUsers()
        }
    }
}

// 在Activity中观察
viewModel.users.observe(this) { users ->
    adapter.submitList(users)
}

2.3 Room #

Room是SQLite的抽象层,提供了编译时SQL验证。

kotlin
@Entity
data class User(
    @PrimaryKey val id: Long,
    val name: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    suspend fun getAll(): List<User>
}

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

2.4 Navigation #

Navigation组件用于管理应用内导航。

kotlin
// 使用NavController
findNavController().navigate(R.id.action_to_detail)

// 使用Safe Args
val action = HomeFragmentDirections.actionToDetail(userId)
findNavController().navigate(action)

2.5 DataBinding #

DataBinding用于将数据绑定到UI。

xml
<layout>
    <data>
        <variable
            name="user"
            type="com.example.User" />
    </data>
    
    <TextView
        android:text="@{user.name}" />
</layout>

2.6 WorkManager #

WorkManager用于管理后台任务。

kotlin
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setConstraints(
        Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()
    )
    .build()

WorkManager.getInstance(context).enqueue(workRequest)

2.7 Paging #

Paging用于分页加载数据。

kotlin
class UserPagingSource : PagingSource<Int, User>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, User> {
        return try {
            val page = params.key ?: 1
            val response = api.getUsers(page)
            LoadResult.Page(
                data = response.data,
                prevKey = if (page == 1) null else page - 1,
                nextKey = if (response.data.isEmpty()) null else page + 1
            )
        } catch (e: Exception) {
            LoadResult.Error(e)
        }
    }
}

三、基础组件 #

3.1 AppCompat #

AppCompat提供向后兼容的UI组件。

kotlin
implementation("androidx.appcompat:appcompat:1.6.1")

class MainActivity : AppCompatActivity()

3.2 Android KTX #

KTX提供Kotlin扩展函数。

kotlin
implementation("androidx.core:core-ktx:1.12.0")

// 使用扩展函数
view.doOnLayout { 
    // 布局完成后的操作
}

sharedPreferences.edit {
    putString("key", "value")
}

3.3 Test #

Test提供测试框架。

kotlin
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")

四、行为组件 #

4.1 Notifications #

通知管理。

kotlin
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentTitle("标题")
    .setContentText("内容")
    .setSmallIcon(R.drawable.ic_notification)
    .build()

NotificationManagerCompat.from(context).notify(1, notification)

4.2 Permissions #

权限管理。

kotlin
private val requestPermission = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted ->
    if (isGranted) {
        // 权限已授予
    }
}

requestPermission.launch(Manifest.permission.CAMERA)

五、界面组件 #

5.1 Fragment #

Fragment管理。

kotlin
class MyFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.fragment_my, container, false)
    }
}

5.2 Layout #

布局组件。

kotlin
// ConstraintLayout
implementation("androidx.constraintlayout:constraintlayout:2.1.4")

// RecyclerView
implementation("androidx.recyclerview:recyclerview:1.3.2")

六、添加Jetpack依赖 #

6.1 在build.gradle中配置 #

kotlin
dependencies {
    // ViewModel
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
    
    // LiveData
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
    
    // Room
    implementation("androidx.room:room-runtime:2.6.1")
    implementation("androidx.room:room-ktx:2.6.1")
    kapt("androidx.room:room-compiler:2.6.1")
    
    // Navigation
    implementation("androidx.navigation:navigation-fragment-ktx:2.7.6")
    implementation("androidx.navigation:navigation-ui-ktx:2.7.6")
    
    // DataBinding
    buildFeatures {
        dataBinding = true
    }
    
    // WorkManager
    implementation("androidx.work:work-runtime-ktx:2.9.0")
    
    // Paging
    implementation("androidx.paging:paging-runtime-ktx:3.2.1")
}

七、Jetpack最佳实践 #

7.1 推荐架构 #

text
┌─────────────────────────────────────────────────────┐
│                    UI Layer                          │
│    Activity/Fragment ←→ ViewModel                   │
├─────────────────────────────────────────────────────┤
│                  Data Layer                          │
│    Repository ←→ Room/RemoteDataSource              │
└─────────────────────────────────────────────────────┘

7.2 单一数据源 #

kotlin
class UserRepository(
    private val localDataSource: UserLocalDataSource,
    private val remoteDataSource: UserRemoteDataSource
) {
    fun getUsers(): Flow<List<User>> = flow {
        // 先返回本地数据
        emit(localDataSource.getUsers())
        
        // 从网络获取最新数据
        val remoteUsers = remoteDataSource.getUsers()
        
        // 更新本地数据
        localDataSource.saveUsers(remoteUsers)
        
        // 返回最新数据
        emit(remoteUsers)
    }
}

7.3 依赖注入 #

kotlin
// 使用Hilt
@HiltAndroidApp
class MyApp : Application()

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    
    private val viewModel: MainViewModel by viewModels()
}

八、总结 #

本章介绍了Jetpack的基本概念:

  1. Jetpack的优势和组件分类
  2. 架构组件概述
  3. 基础组件概述
  4. 行为组件概述
  5. 界面组件概述
  6. 依赖配置
  7. 最佳实践

Jetpack是现代Android开发的基石,后续章节将详细介绍各个组件的使用。

最后更新:2026-03-26