Android Jetpack组件之App Startup,源码+原理+手写框架
在沒有使用App Startup的時候,如何保證content providers的初始化順序呢?其實很簡單,在配置清單中將先啟動的content provider的<meta-data>標簽放在前面即可。
下面我們來看下如何進行初始化。
通過App Startup來運行依賴項的初始化有兩種方式:
-
自動初始化(automatic initialization)
-
手動初始化(manually initialization)
無論是自動初始化還是手動初始化都需要在app或者library中的build.gradle文件中添加如下依賴:
實現自動初始化(拿官方例子來看)
假設你的應用程序依賴了WorkManager,并且需要在程序一開始啟動時就初始化WorkManager,定義一個WorkManagerInitializer類并且實現Initializer<WorkManager>接口:
如圖中所示,dependencies()方法返回了一個空列表,意思是我WorkManager實例化誰也不需要依賴,我自己個就能行。 假設我們的應用依賴了另一個叫做ExampleLogger的庫,這個庫依賴于WorkManager。這也就意味著,初始化這個庫必須先確保WorkManager的實例已經被初始化了才可以。那么如何做呢?我們看下官方代碼:
代碼中定義了一個ExampleLoggerInitializer類并且實現了Initializer<ExampleLogger>接口。這個時候我們看到dependencies()方法返回的就不是空列表了,而是包含了WorkManagerInitializer的一個列表,這樣ExampleLogger要想初始化,必須先初始化WorkManager。
提示:如果App中之前使用content providers來初始化應用程序中的組件,請確保是使用App Startup時刪除這些content providers
App Startup包含了一個名為InitializationProvider的特殊的content provider,它用來找到并且調用你的組件初始化器。那么這個過程是什么樣的呢?
-
首先,通過檢查InitializationProvider清單標簽下的<meta-data>標簽,找到組件初始化器;
-
App Startup調用它找到的所有組件初始化器的dependencies()方法。
這就意味著如果想要讓App Startup找到組件初始化器,必須滿足下面的一個條件:
-
組件初始化器在InitializationProvider清單標簽下配置了相應的<meta-data>標簽;
-
組件初始化器在一個已被找到的組件初始化器的dependencies()方法中被列出;
從我們上面寫過的WorkManagerInitializer和ExampleLoggerInitializer這兩個例子中來說,為了確保初始化器能被實現,需要在清單文件中配置如下代碼:
如圖中所示,我們只配置了ExampleLoggerInitializer的<meta-data>標簽,因為它是依賴于WorkManager的,并且滿足了第二條:dependencies()方法中列出了它依賴于WorkManager,如果ExampleLoggerInitializer能被炸到,那么WorkManagerInitializer一定也能被找到。
tools:node="merge"屬性是為了確保清單合并工具可能造成的沖突問題
App Startup庫包含了一系列的lint規則,通過這些規則,你能夠檢查是否正確定義了組件初始化器。你可以在終端通過./gradlew :app:lintDebug命令執行lint檢查。
實現手動初始化
通常來說,當你使用App Startup時,InitializationProvider對象就會使用AppInitializer在App啟動時來自動尋找并且運行初始化器。然而,你也可以直接調用。AppInitializer來手動初始化不需要在啟動時就調用的組件初始化器。這個操作被稱作懶初始化,它能夠減少程序啟動的時間。要想實現手動初始化,必須先禁止掉你想要手動初始化的組件的自動初始化功能。 為了禁止掉單個組件的自動初始化功能,可以在清單文件中移除那個
《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整內容開源分享
組件的<meta-data>標簽,舉例來說,我們想禁止ExampleLogger的自動初始化:
使用tools:node="remove"而不是直接移除這個標簽是為了確保清單合并工具能夠移除所有合并文件的這個標簽。
提示: 禁用組件的自動初始化也會禁用該組件的依賴項的自動初始化,比如我禁用了ExampleLogger,而ExampleLogger依賴了WorkManager,那么WorkManager也不會自動初始化了。
我們現在知道如何禁止單個組件的自動初始化,那么如何禁止全部組件的自動初始化,轉而手動初始化呢?Android官方給我們提供了這個寫法:
禁用自動初始化后,你可以使用AppInitializer手動初始化組件和它的依賴。還是看下官方代碼:
通過上述代碼,App Startup也對WorkManager進行了初始化,因為ExampleLogger依賴了WorkManager。
源碼分析
App Startup包中代碼并不多,只有五個類
其中最核心的類就是InitializationProvider,它是繼承了ContentProvider,這樣我們就懂了,在onCreate()方法中,可以看到它其實是調用了AppInitializer這個類中的discoverAndInitialize()方法,我們簡單看下這個代碼:
代碼很簡單,就是解析出來metadata中的數據,然后遍歷metadata拿到配置的初始化器,然后調用每個初始化器的初始化方法,也就是doInitialize()方法。接下來再看下這個方法:
可以看到在執行初始化的時候,先判斷了是否有依賴項,有的話先執行依賴項的初始化。
參考資料
-
https://developer.android.com/topic/libraries/app-startup
-
https://proandroiddev.com/androidx-app-startup-698855342f80
-
https://gitee.com/androidmaniu/android-notes/blob/master/README.md
寫在后面
關于App Startup的內容暫時就這么多了,如果你正在用Jetpack,那不妨試用這個組件吧。
總結
以上是生活随笔為你收集整理的Android Jetpack组件之App Startup,源码+原理+手写框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP程序设计实训(五)——JSP基本语
- 下一篇: Android版本更新知识(检测、升级)