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的基本概念:
- Jetpack的优势和组件分类
- 架构组件概述
- 基础组件概述
- 行为组件概述
- 界面组件概述
- 依赖配置
- 最佳实践
Jetpack是现代Android开发的基石,后续章节将详细介绍各个组件的使用。
最后更新:2026-03-26