Jetpack

初识Jetpack

摘要:初识Jetpack

  • Jetpack架构
  • 如何使用
  • jetpack的介绍

Jetpack

架构

image-20221201114656363

使用示例

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
android {
···
dataBinding {
enabled = true
}
}
dependencies {
···
implementation "androidx.fragment:fragment-ktx:$rootProject.fragmentVersion"
implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$rootProject.lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$rootProject.lifecycleVersion"
}

fragment_plant_detail.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>
<variable
name="viewModel"
type="com.google.samples.apps.sunflower.viewmodels.PlantDetailViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
···
android:text="@{viewModel.plant.name}"/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

PlantDetailFragment.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class PlantDetailFragment : Fragment() {

private val args: PlantDetailFragmentArgs by navArgs()
private lateinit var shareText: String

private val plantDetailViewModel: PlantDetailViewModel by viewModels {
InjectorUtils.providePlantDetailViewModelFactory(requireActivity(), args.plantId)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = DataBindingUtil.inflate<FragmentPlantDetailBinding>(
inflater, R.layout.fragment_plant_detail, container, false).apply {
viewModel = plantDetailViewModel
lifecycleOwner = this@PlantDetailFragment
}

plantDetailViewModel.plant.observe(this) { plant ->
// 更新相关 UI
}

return binding.root
}
}

Plant.kt

1
2
3
data class Plant (
val name: String
)

PlantDetailViewModel.kt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class PlantDetailViewModel(
plantRepository: PlantRepository,
private val plantId: String
) : ViewModel() {

val plant: LiveData<Plant>

override fun onCleared() {
super.onCleared()
viewModelScope.cancel()
}

init {
plant = plantRepository.getPlant(plantId)
}
}

PlantDetailViewModelFactory.kt

1
2
3
4
5
6
7
8
9
10
class PlantDetailViewModelFactory(
private val plantRepository: PlantRepository,
private val plantId: String
) : ViewModelProvider.NewInstanceFactory() {

@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return PlantDetailViewModel(plantRepository, plantId) as T
}
}

InjectorUtils.kt

1
2
3
4
5
6
7
8
9
10
11
12
object InjectorUtils {
private fun getPlantRepository(context: Context): PlantRepository {
···
}

fun providePlantDetailViewModelFactory(
context: Context,
plantId: String
): PlantDetailViewModelFactory {
return PlantDetailViewModelFactory(getPlantRepository(context), plantId)
}
}

Jetpack介绍

背景

App研发朝简单化、易上手发展。推出Android Jetpack让开发者按照模板式开发,让Bug减少,让开发者的精力放在打造应用本身。
可以很方便实现MVVM

好处

  • 消除大量重复样板式的代码。
  • 简化复杂的任务。
  • 提供了强健的向后兼容的能力。
  • 加速Android的开发进程。

JetPack的组成

四部分:Architecture、UI、Foundation、Behavior

  • Foundation:基础
  • Architecture:体系结构
  • UI:视觉交互
  • Behavior:行为

Android Jetpack采用组件化的方式。

Architecture Compinents(结构组件)

  • Data Binding(数据绑定)
  • Room(数据库)
  • WorkManager(后台任务管家)
  • Lifecycle(生命周期)
  • Navigation(导航)
  • Paging(分页)
  • LiveData(底层数据通知更改视图)
  • ViewModel(以注重生命周期的方式管理界面的相关数据)

Foundation(基础)

  • AppCompat(向后兼容)
  • Android KTX(编写更加简洁的Kotlin代码)
  • Multidex(多处理dex的问题)
  • Test(测试)

Behavior(行为)

  • Download manager(下载管理器)
  • Media & playback(媒体和播放)
  • Notification(通知)
  • Permissions(权限)
  • Preferences(偏好设置)
  • Sharing(共享)
  • Slices(切片)

UI(视觉交互)

  • Animation & transitions(动画和过渡)
  • Auto(Auto组件)
  • Emoji(表情)
  • Fragment(碎片)
  • Layout(布局)
  • Palette(调色板)
  • TV(TV)
  • Wear OS by Google(穿戴设备)