生命周期
区分三个关键类
lifecycle他是一个代表android生命周期及其所处状态的对象
lifecycleOwner是具有生命周期的对象的接口,如AppcompatActivity或Activity、Fragment
lifecycleObserver用于观察生命周期的接口,如LiveData,设置生命周期所有者以观察 LiveData,当生命周期所有者处于活动状态时(STARTED
或 RESUMED
),LiveData
观察器才会观察应用数据的更改。
URI
Uri
是 Uniform Resource Identifier(统一资源标识符)的缩写,用于表示一个资源的唯一标识符。
Uri
可以用于表示除了文件之外的许多类型的资源,包括但不限于以下几种:
内容提供器(Content Provider):
Uri
可以用于访问应用程序中使用的内容提供器,例如 Android 系统提供的联系人、短信、通话记录等数据。网络资源:
Uri
可以用于表示网络资源,例如网页、图片、音视频等。联系人:
Uri
可以用于表示联系人的唯一标识符,例如content://com.android.contacts/contacts/1
表示 ID 为 1 的联系人。地理位置:
Uri
可以用于表示地理位置的坐标,例如geo:37.7749,-122.4194
表示旧金山市的经纬度坐标。Android 资源:
Uri
可以用于表示 Android 应用程序中的资源,例如图片、音频、视频等。可以使用ContentResolver
类从Uri
对象中读取资源数据。其他类型的资源:
Uri
还可以用于表示其他类型的资源,例如日历事件、电子邮件等。
Android 版本
Android API 级别与 Android 版本的对应关系:
Android API 级别 | Android 版本 |
---|---|
31 | Android 13 |
30 | Android 12 |
29 | Android 10, 11 |
28 | Android 9 |
27 | Android 8.1 |
26 | Android 8.0 |
25 | Android 7.1 |
24 | Android 7.0 |
23 | Android 6.0 |
22 | Android 5.1 |
21 | Android 5.0 |
20 | Android 4.4W |
19 | Android 4.4 |
18 | Android 4.3 |
17 | Android 4.2 |
16 | Android 4.1 |
15 | Android 4.0.3 |
14 | Android 4.0 |
13 | Android 3.2 |
12 | Android 3.1 |
11 | Android 3.0 |
10 | Android 2.3.3 |
9 | Android 2.3 |
8 | Android 2.2 |
7 | Android 2.1 |
6 | Android 2.0.1 |
5 | Android 2.0 |
Android Gradle插件版本与Gradle版本对应
插件版本 | 所需的最低 Gradle 版本 |
---|---|
8.1 | 8.0 |
8.0 | 8.0 |
7.4 | 7.5 |
7.3 | 7.4 |
7.2 | 7.3.3 |
7.1 | 7.2 |
7.0 | 7.0 |
4.2.0+ | 6.7.1 |
Android Gradle 插件和 Android Studio 兼容性
Android Studio 版本 | 所需插件版本 | |
---|---|---|
Giraffe | 2022.3.1 | 3.2-8.1 |
Flamingo | 2022.2.1 | 3.2-8.0 |
Electric Eel | 2022.1.1 | 3.2-7.4 |
Dolphin | 2021.3.1 | 3.2-7.3 |
Chipmunk | 2021.2.1 | 3.2-7.2 |
Bumblebee | 2021.1.1 | 3.2-7.1 |
Arctic Fox | 2020.3.1 | 3.1-7.0 |
fragment和fragment生命周期
fragment 就是可重复使用的应用界面片段。与 activity 类似,fragment 具有生命周期并可以响应用户输入。fragment 在屏幕上显示时,会始终包含在 activity 的视图层次结构中。由于 fragment 侧重于可重用性和模块化,因此甚至可以由单个 activity 同时托管多个 fragment。每个 fragment 都管理着自己单独的生命周期。
fragment 生命周期
和 activity 一样,fragment 可以初始化以及从内存中移除;在整个存在期间,fragment 也会在屏幕上显示、消失和重新显示。此外,与 activity 类似,fragment 也有具有多种状态的生命周期,并提供了几种可替换的方法来响应它们之间的转换。fragment 生命周期有五种状态,由 Lifecycle.State 枚举表示。
INITIALIZED:fragment 的一个新实例已实例化。
CREATED:系统已调用第一批 fragment 生命周期方法。在 fragment 处于此状态期间,系统也会创建与其关联的视图。
STARTED:fragment 在屏幕上可见,但没有焦点,这意味着其无法响应用户输入。
RESUMED:fragment 可见并已获得焦点。
DESTROYED:fragment 对象已解除实例化。
此外,与 activity 类似,Fragment
类还提供了多种可替换的方法来响应生命周期事件。
onCreate()
:fragment 已实例化并处于CREATED
状态。不过,其对应的视图尚未创建。onCreateView()
:此方法可用于膨胀布局。fragment 已进入CREATED
状态。onViewCreated()
:此方法在创建视图后调用。在此方法中,您通常会通过调用findViewById()
将特定视图绑定到属性。onStart()
:fragment 已进入STARTED
状态。onResume()
:fragment 已进入RESUMED
状态,现已具有焦点(可响应用户输入)。onPause()
:fragment 已重新进入STARTED
状态。相应界面对用户可见。onStop()
:fragment 已重新进入CREATED
状态。该对象已实例化,但它在屏幕上不再显示。onDestroyView()
:该方法在 fragment 进入DESTROYED
状态之前调用。视图已从内存中移除,但 fragment 对象仍然存在。onDestroy()
:fragment 进入DESTROYED
状态。
下图总结了 fragment 生命周期以及状态之间的转换。
生命周期状态和回调方法与用于 activity 的方法非常相似。但请注意 onCreate()
方法的差异。通过 activity,您可以使用此方法膨胀布局和绑定视图。不过,在 fragment 生命周期中,系统会在创建视图之前调用 onCreate()
,所以您无法在此处膨胀布局。您可以改为在 onCreateView()
中执行此操作。然后,在创建视图后,系统会调用 onViewCreated()
方法,您可以在该方法中将属性绑定到特定视图。
虽然这可能听起来理论性很强,但您已经基本了解 fragment 的工作原理以及它们与 activity 的相似之处和不同之处。在此 Codelab 的其余部分,您将实际运用这些知识。首先,您需要迁移之前使用的 Words 应用,以使用基于 fragment 的布局。然后,您可以在单个 activity 内的多个 fragment 之间实现导航。
命名规范(下划线开头的属性名)
在 Kotlin 以及一般的编程语言中,通常会遇到以下划线开头的属性名称。这通常表示属性不应直接访问。使用viewBinding时,您可以使用绑定属性访问 XXXFragment
中的视图绑定。不过,您无需在 Fragment
之外访问 _binding
属性。
class XXXFragment: Fragment(){
private var _binding: FragmentXXXBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container:
ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding =
FragmentXXXBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
}