日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Jetpack组件之App Startup,源码+原理+手写框架

發布時間:2023/12/9 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,源码+原理+手写框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。