Android Jetpack系列之App Startup使用詳解
更新時間:2022年10月09日 09:53:28 作者:今陽
這篇文章主要為大家介紹了Android Jetpack系列之App Startup使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
定義
- 一個可以用于加速App啟動速度的庫;
- 提供在 App 啟動時初始化組件簡單、高效的方法,可以使用 App Startup 顯示的設(shè)置初始化順序;
- 提供了一個 ContentProvider 來運行所有依賴項的初始化,避免每個第三方庫單獨使用 ContentProvider 進行初始化,從而提高了應(yīng)用的程序的啟動速度;
解決了什么問題
- 如果你在項目當中引入了非常多的第三方庫,那么Application中的代碼就可能會變成這個樣子(這還只是我們實際項目的部分代碼):
class MyApplication : Application() { override fun onCreate() { super.onCreate() CommonModule.init(this); XCrash.init(this, new XCrash.InitParameters()); initQbSdk(this); initRetrofit(); initDialogSetting(); initBugly(); initWeChat(); initUmeng(); initDoKit(); initNIM(); } ... }
- 有些更加聰明的庫設(shè)計者,想到可以借助ContentProvider自動調(diào)用初始化接口,從而避免顯示的初始化:
//1. 繼承 ContentProvider,在onCreate中初始化 class MyProvider : ContentProvider() { override fun onCreate(): Boolean { context?.let { //ContentProvider中也可以取得Context LjyToastUtil.getInstance().init(it) } return true } //其他方法用不到,直接return null 或 return -1 即可 ... } //2. ContentProvider是四大組件之一,需要在AndroidManifest.xml文件中進行注冊 <application ...> ... <provider android:name=".MyProvider" //authorities的值沒有固定要求,但要保證該值在整個手機上是唯一的,所以通常會使用${applicationId}作為前綴,以防止和其他應(yīng)用程序沖突 android:authorities="${applicationId}.myProvider" android:exported="false" /> </application> //3. 自定義的MyProvider在什么時候執(zhí)行呢? 調(diào)用流程如下: Application.attachBaseContext() -> ContentProvider.onCreate() -> Application.onCreate() //這是在冷啟動階段自動運行初始化的,來看一下 Android 10 系統(tǒng)源碼 private void handleBindApplication(AppBindData data) { ... if (!data.restrictedBackupMode) { if (!ArrayUtils.isEmpty(data.providers)) { // 創(chuàng)建ContentProvider installContentProviders(app, data.providers); } } ... try { // 調(diào)用調(diào)用 Application 的 OnCreate 方法 mInstrumentation.callApplicationOnCreate(app); } catch (Exception e) { ... } ... }
- 此方案的缺點:ContentProvider會增加許多額外的耗時, ContentProvider是Android四大組件之一,這個組件相對來說是比較重量級的, 也就是說,本來我的初始化操作可能是一個非常輕量級的操作,依賴于ContentProvider之后就變成了一個重量級的操作了;
如何解決問題
- 鑒于前兩者的缺點,Google推出了App Startup
- App Startup是如何解決問題的呢?它可以將所有用于初始化的ContentProvider合并成一個,從而使App的啟動速度變得更快。
使用方法
1. 引入AppStartup依賴
implementation "androidx.startup:startup-runtime:1.1.0-alpha01"
2. 實現(xiàn)App Startup庫的Initializer接口
定義一個用于執(zhí)行初始化的類,并實現(xiàn)App Startup庫的Initializer接口
class LjyToastInitializer : Initializer<Unit> { //在create方法中執(zhí)行要初始化的代碼 override fun create(context: Context) { LjyToastUtil.getInstance().init(context) } //dependencies方法用于配置當前LjyToastInitializer是否還依賴于其他Initializer //有的話在此配置,沒有就return emptyList()即可 override fun dependencies(): List<Class<out Initializer<*>>> { return emptyList() } }
3. 在庫的AndroidManifest.xml中配置MyInitializer
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="com.jinyang.jetpackdemo.LjyToastInitializer" android:value="androidx.startup" /> </provider>
- 當App啟動的時候會自動執(zhí)行App Startup庫中內(nèi)置的ContentProvider,并在它的ContentProvider中會搜尋所有注冊的Initializer,然后逐個調(diào)用它們的create()方法來進行初始化操作;
延遲初始化
- 如果不希望在啟動的時候自動初始化某個庫,而是想要在特定的時機手動初始化,這要怎么辦呢?
- 首先通過分析源碼,找到該庫初始化的Initializer的全路徑類名
- 在項目的AndroidManifest.xml當中加入如下配置:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="com.jinyang.jetpackdemo.LjyToastInitializer" android:value="androidx.startup" tools:node="remove" /> </provider>
- 禁用單個庫就在meta-data中加入tools:node="remove"
- 禁用所有庫就是在provider標簽中加入tools:node="remove"
- 然后在需要的地方去手動的初始化
AppInitializer.getInstance(this) .initializeComponent(LjyToastInitializer::class.java)
- 延遲初始化也是非常有用的,可以減少 App 的啟動時間,提高啟動速度。
以上就是Android Jetpack系列之App Startup使用詳解的詳細內(nèi)容,更多關(guān)于Android Jetpack App Startup的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
相關(guān)文章
Android音視頻開發(fā)只硬件解碼組件MediaCodec講解
在Android開發(fā)中提供了實現(xiàn)音視頻編解碼工具MediaCodec,針對對應(yīng)音視頻解碼類型通過該類創(chuàng)建對應(yīng)解碼器就能實現(xiàn)對數(shù)據(jù)進行解碼操作。本文通過示例詳細講解了MediaCodec的使用,需要的可以參考一下2023-01-01Android 中通過實現(xiàn)線程更新Progressdialog (對話進度條)
這篇文章主要介紹了Android 中通過實現(xiàn)線程更新Progressdialog (對話進度條)的相關(guān)資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2016-11-11Android調(diào)試神器stetho使用詳解和改造
今天小編就為大家分享一篇關(guān)于Android調(diào)試神器stetho使用詳解和改造,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02Android將camera獲取到的YuvData在jni中轉(zhuǎn)化為Mat方法
今天小編就為大家分享一篇Android將camera獲取到的YuvData在jni中轉(zhuǎn)化為Mat方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08