Jetpack之Startup快速掌握
好文推薦
作者:LKV_劉言
功能
用於為App提供初始化回撥能力。體系化得將各種App內的功能模組、所引入的SDK的初始化聯合起來,不各自為戰。一方面能夠將所有的初始化方式進行統一,在程式碼學習層面便於進入。另一方面,在初始化方式收斂後也能夠有效的做效能資料監控。
配置
implementation "androidx.startup:startup-runtime:1.0.0"
使用
實現子類
每一個需要初始化的元件實現一個Initializer<T>
的子類
並實現兩個方法:
create
這個方法要求返回你要初始化的元件的物件例項,可以new出來,也可以使用Builder等等,by your selfdependencies
這個方法用來返回一系列的Initializer
的子類的Class集合。意義是告知初始化框架,當前這個元件的初始化需要依賴其他的哪些元件初始化。可以沒有有效內容。
例項(來自官方)
// Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
override fun create(context: Context): WorkManager {
val configuration = Configuration.Builder().build()
WorkManager.initialize(context, configuration)
return WorkManager.getInstance(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
// No dependencies on other libraries.
return emptyList()
}
}
宣告Manifest
兩點注意:
- 要在Manifest中宣告其原理中真正使用的ContentProvider類
androidx.startup.InitializationProvider
,注意author要攜帶${applicationId}
來避免與其他App產生衝突 - 記得一定要在這個provider下宣告
meta-data
第一點不做解釋了,其基本原理就是依靠ContentProvider的onCreate
會在應用初始化時被自動呼叫這一點。
關於第二個需要解釋:
Startup會去找自己Provider下宣告的第一個meta-data
所對應的類,來對他進行初始化,如果他宣告瞭他有依賴項,那麼他的依賴項也會被初始化。這樣,一個初始化鏈路就行程了。
例項:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- This entry makes ExampleLoggerInitializer discoverable. -->
<meta-data android:name="com.example.ExampleLoggerInitializer"
android:value="androidx.startup" />
</provider>
meta-data
支援宣告多個,只要他們的android:value
都是androidx.startup
就會被收集到:
原理
概覽
核心
ContentProvider的onCreate
生命週期會在Application的onCreate
之前被ActivityThread
呼叫:
並且,這個行為是系統行為,不需要使用者去主動觸發,也就節省了XXX.init
這種程式碼呼叫。
流程
InitializationProvider
呼叫AppInitializer.discoverAndInitialize()
方法AppInitializer.discoverAndInitialize()
掃描AndroidManifest.xml中InitializationProvider
下的註冊資訊中的meta-data進行初始化元件發現:
需要注意的是:
- 只要
meta-data
的android:value
是androidx.startup
那麼就可以被收集到,後續的觸發是按照在Manifest中宣告的順序進行的 - 截圖中程式碼沒有提到的,會使用Map
mInitialized
來確保每個類只會被初始化一次,而通過臨時的initializing
確保在依賴關係中不允許迴圈依賴
第二點可以在下一步得到驗證:
- 呼叫
AppInitializer.doInitialize()
補充該方法的後續程式碼:
總結
- 初始化類應該具有
public
的無參建構函式 - 初始化中的狀態通過Set儲存Class達成,初始化完成的狀態由Map以Class為Key,對應
create
所產生的物件為Value表達 - 不能有迴圈依賴
寫在最後
Startup庫無疑為開發者提供了最為便捷的初始化方式,並且還貼心的提供了初始化項按照依賴關係進行的功能。但筆者認為,其在成熟、多樣的產品中,有幾點不足:
- 不支援外部定製、監聽相關初始化資料,如初始化時間的上報和超時報警
- 不支援延遲初始化、懶載入初始化等多樣的初始化型別
- 與2類似,其初始化型別單一,或者說都可以認為是普通的初始化。如果想要在所有前邊插入一個、所有後邊插入一個作為特殊的初始化項,那麼還需要開發者自行開發
一來,通過本文讀者可以更明白該元件背後做了什麼,可以更加自信、篤定、靈活的使用。另一方面,如果也認可筆者提到的問題的話,相信解法也是相對比較明確的,相信大家可以打造出適合自己的工具。
大家如果還想了解更多Android 相關的更多知識點,可以加入Android粉絲交流群:872206502
粉絲交流群
相關文章
- startup,startup mount,startup nomount之間的區別
- Android Jetpack 之 LiveDataAndroidJetpackLiveData
- Android Jetpack之ViewModelAndroidJetpackView
- Android Jetpack 之 LifecycleAndroidJetpack
- Android Jetpack 之 ViewModelAndroidJetpackView
- Jetpack 之 Navigation 初探JetpackNavigation
- 快速掌握keepalived
- asp.net core 系列之StartupASP.NET
- JavaWeb開發之load-on-startup用法JavaWeb
- Android Jetpack Architecture原理之ViewModelAndroidJetpackView
- Gradle自動化專案構建之快速掌握GroovyGradle
- 分分鐘掌握快速排序排序
- 【git教程】快速掌握gitGit
- Android Jetpack 之Navigation Architecture Component使用AndroidJetpackNavigation
- Jetpack 之 LifeCycle 元件使用詳解Jetpack元件
- 玩轉Android Jetpack系列之ViewModeAndroidJetpackView
- Android Jetpack 架構元件之 NavigationAndroidJetpack架構元件Navigation
- startup nomount
- 快速掌握 MongoDB 資料庫MongoDB資料庫
- 快速掌握 Go 工作區模式Go模式
- Android Jetpack元件之Lifecycles庫詳解AndroidJetpack元件
- 硬核講解 Jetpack 之 LifeCycle 使用篇Jetpack
- Android Jetpack架構元件(七)之WorkManagerAndroidJetpack架構元件
- 作為一名安卓開發人員,怎麼快速掌握熱門技術?!Jetpack Compose+鴻蒙入門指南安卓Jetpack鴻蒙
- 如何快速掌握一個ui框架UI框架
- Android_Jetpack:Paging元件之BoundaryCallback的使用AndroidJetpack元件
- JetpackJetpack
- 一文帶你快速掌握AQSAQS
- 快速掌握Python基礎語法(下)Python
- 快速掌握 Websocket 介面測試|Eolink ApikitWebAPI
- 如何才能夠快速掌握Python課程?Python
- 快速掌握mongoDB(二)——聚合管道和MapReduceMongoDB
- 快速掌握javascript的apply()和call()方法JavaScriptAPP
- 掌握6條技能快速Java入門Java
- 教你如何快速掌握Python就業技能Python就業
- 怎樣才能快速掌握ps技術
- MySQL Server Startup ScriptMySqlServer
- OA軟體之報表與統計,快速掌握各崗位工作流程