生命周期
區(qū)分三個(gè)關(guān)鍵類
lifecycle他是一個(gè)代表android生命周期及其所處狀態(tài)的對(duì)象
lifecycleOwner是具有生命周期的對(duì)象的接口,如AppcompatActivity或Activity、Fragment
lifecycleObserver用于觀察生命周期的接口,如LiveData,設(shè)置生命周期所有者以觀察 LiveData,當(dāng)生命周期所有者處于活動(dòng)狀態(tài)時(shí)(STARTED 或 RESUMED),LiveData 觀察器才會(huì)觀察應(yīng)用數(shù)據(jù)的更改。
URI
Uri 是 Uniform Resource Identifier(統(tǒng)一資源標(biāo)識(shí)符)的縮寫,用于表示一個(gè)資源的唯一標(biāo)識(shí)符。
Uri 可以用于表示除了文件之外的許多類型的資源,包括但不限于以下幾種:
內(nèi)容提供器(Content Provider):
Uri可以用于訪問應(yīng)用程序中使用的內(nèi)容提供器,例如 Android 系統(tǒng)提供的聯(lián)系人、短信、通話記錄等數(shù)據(jù)。網(wǎng)絡(luò)資源:
Uri可以用于表示網(wǎng)絡(luò)資源,例如網(wǎng)頁(yè)、圖片、音視頻等。聯(lián)系人:
Uri可以用于表示聯(lián)系人的唯一標(biāo)識(shí)符,例如content://com.android.contacts/contacts/1表示 ID 為 1 的聯(lián)系人。地理位置:
Uri可以用于表示地理位置的坐標(biāo),例如geo:37.7749,-122.4194表示舊金山市的經(jīng)緯度坐標(biāo)。Android 資源:
Uri可以用于表示 Android 應(yīng)用程序中的資源,例如圖片、音頻、視頻等。可以使用ContentResolver類從Uri對(duì)象中讀取資源數(shù)據(jù)。其他類型的資源:
Uri還可以用于表示其他類型的資源,例如日歷事件、電子郵件等。
Android 版本
Android API 級(jí)別與 Android 版本的對(duì)應(yīng)關(guān)系:
| Android API 級(jí)別 | 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版本對(duì)應(yīng)
| 插件版本 | 所需的最低 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 就是可重復(fù)使用的應(yīng)用界面片段。與 activity 類似,fragment 具有生命周期并可以響應(yīng)用戶輸入。fragment 在屏幕上顯示時(shí),會(huì)始終包含在 activity 的視圖層次結(jié)構(gòu)中。由于 fragment 側(cè)重于可重用性和模塊化,因此甚至可以由單個(gè) activity 同時(shí)托管多個(gè) fragment。每個(gè) fragment 都管理著自己?jiǎn)为?dú)的生命周期。
fragment 生命周期
和 activity 一樣,fragment 可以初始化以及從內(nèi)存中移除;在整個(gè)存在期間,fragment 也會(huì)在屏幕上顯示、消失和重新顯示。此外,與 activity 類似,fragment 也有具有多種狀態(tài)的生命周期,并提供了幾種可替換的方法來響應(yīng)它們之間的轉(zhuǎn)換。fragment 生命周期有五種狀態(tài),由 Lifecycle.State 枚舉表示。
INITIALIZED:fragment 的一個(gè)新實(shí)例已實(shí)例化。
CREATED:系統(tǒng)已調(diào)用第一批 fragment 生命周期方法。在 fragment 處于此狀態(tài)期間,系統(tǒng)也會(huì)創(chuàng)建與其關(guān)聯(lián)的視圖。
STARTED:fragment 在屏幕上可見,但沒有焦點(diǎn),這意味著其無(wú)法響應(yīng)用戶輸入。
RESUMED:fragment 可見并已獲得焦點(diǎn)。
DESTROYED:fragment 對(duì)象已解除實(shí)例化。
此外,與 activity 類似,Fragment 類還提供了多種可替換的方法來響應(yīng)生命周期事件。
onCreate():fragment 已實(shí)例化并處于CREATED狀態(tài)。不過,其對(duì)應(yīng)的視圖尚未創(chuàng)建。onCreateView():此方法可用于膨脹布局。fragment 已進(jìn)入CREATED狀態(tài)。onViewCreated():此方法在創(chuàng)建視圖后調(diào)用。在此方法中,您通常會(huì)通過調(diào)用findViewById()將特定視圖綁定到屬性。onStart():fragment 已進(jìn)入STARTED狀態(tài)。onResume():fragment 已進(jìn)入RESUMED狀態(tài),現(xiàn)已具有焦點(diǎn)(可響應(yīng)用戶輸入)。onPause():fragment 已重新進(jìn)入STARTED狀態(tài)。相應(yīng)界面對(duì)用戶可見。onStop():fragment 已重新進(jìn)入CREATED狀態(tài)。該對(duì)象已實(shí)例化,但它在屏幕上不再顯示。onDestroyView():該方法在 fragment 進(jìn)入DESTROYED狀態(tài)之前調(diào)用。視圖已從內(nèi)存中移除,但 fragment 對(duì)象仍然存在。onDestroy():fragment 進(jìn)入DESTROYED狀態(tài)。
下圖總結(jié)了 fragment 生命周期以及狀態(tài)之間的轉(zhuǎn)換。

生命周期狀態(tài)和回調(diào)方法與用于 activity 的方法非常相似。但請(qǐng)注意 onCreate() 方法的差異。通過 activity,您可以使用此方法膨脹布局和綁定視圖。不過,在 fragment 生命周期中,系統(tǒng)會(huì)在創(chuàng)建視圖之前調(diào)用 onCreate(),所以您無(wú)法在此處膨脹布局。您可以改為在 onCreateView() 中執(zhí)行此操作。然后,在創(chuàng)建視圖后,系統(tǒng)會(huì)調(diào)用 onViewCreated() 方法,您可以在該方法中將屬性綁定到特定視圖。
雖然這可能聽起來理論性很強(qiáng),但您已經(jīng)基本了解 fragment 的工作原理以及它們與 activity 的相似之處和不同之處。在此 Codelab 的其余部分,您將實(shí)際運(yùn)用這些知識(shí)。首先,您需要遷移之前使用的 Words 應(yīng)用,以使用基于 fragment 的布局。然后,您可以在單個(gè) activity 內(nèi)的多個(gè) fragment 之間實(shí)現(xiàn)導(dǎo)航。
命名規(guī)范(下劃線開頭的屬性名)
在 Kotlin 以及一般的編程語(yǔ)言中,通常會(huì)遇到以下劃線開頭的屬性名稱。這通常表示屬性不應(yīng)直接訪問。使用viewBinding時(shí),您可以使用綁定屬性訪問 XXXFragment 中的視圖綁定。不過,您無(wú)需在 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
}
}