最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Jetpack系列之App Startup使用詳解

 更新時間:2022年10月09日 09:53:28   作者:今陽  
這篇文章主要為大家介紹了Android Jetpack系列之App Startup使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

定義

  • 一個可以用于加速App啟動速度的庫;
  • 提供在 App 啟動時初始化組件簡單、高效的方法,可以使用 App Startup 顯示的設(shè)置初始化順序;
  • 提供了一個 ContentProvider 來運行所有依賴項的初始化,避免每個第三方庫單獨使用 ContentProvider 進(jìn)行初始化,從而提高了應(yīng)用的程序的啟動速度;

解決了什么問題

  • 如果你在項目當(dā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文件中進(jìn)行注冊
<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方法用于配置當(dāng)前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>
  • 當(dāng)App啟動的時候會自動執(zhí)行App Startup庫中內(nèi)置的ContentProvider,并在它的ContentProvider中會搜尋所有注冊的Initializer,然后逐個調(diào)用它們的create()方法來進(jìn)行初始化操作;

延遲初始化

  • 如果不希望在啟動的時候自動初始化某個庫,而是想要在特定的時機手動初始化,這要怎么辦呢?
  • 首先通過分析源碼,找到該庫初始化的Initializer的全路徑類名
  • 在項目的AndroidManifest.xml當(dāng)中加入如下配置:
<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標(biāo)簽中加入tools:node="remove"
  • 然后在需要的地方去手動的初始化
AppInitializer.getInstance(this)
        .initializeComponent(LjyToastInitializer::class.java)
  • 延遲初始化也是非常有用的,可以減少 App 的啟動時間,提高啟動速度。

以上就是Android Jetpack系列之App Startup使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Android Jetpack App Startup的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android實現(xiàn)界面的自動跳轉(zhuǎn)功能

    Android實現(xiàn)界面的自動跳轉(zhuǎn)功能

    界面自動跳轉(zhuǎn)是指在應(yīng)用啟動或某個特定界面顯示后,經(jīng)過預(yù)定的時間或者滿足某些條件后,自動跳轉(zhuǎn)到另一個目標(biāo)界面,本文小編給大家講解了Android實現(xiàn)界面的自動跳轉(zhuǎn)功能,感興趣的小伙伴跟著小編一起來看看吧
    2025-04-04
  • Android開發(fā)實現(xiàn)拍照功能的方法實例解析

    Android開發(fā)實現(xiàn)拍照功能的方法實例解析

    這篇文章主要介紹了Android開發(fā)實現(xiàn)拍照功能的方法,結(jié)合實例形式較為詳細(xì)的分析了Android拍照功能的具體實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android實現(xiàn)可收縮和擴展的TextView

    Android實現(xiàn)可收縮和擴展的TextView

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)可收縮和擴展的TextView,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android小程序?qū)崿F(xiàn)個人信息管理系統(tǒng)

    Android小程序?qū)崿F(xiàn)個人信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Android小程序?qū)崿F(xiàn)個人信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android學(xué)習(xí)筆記之ContentProvider和Uri詳解

    Android學(xué)習(xí)筆記之ContentProvider和Uri詳解

    本篇文章主要介紹了Android學(xué)習(xí)筆記之ContentProvider和Uri詳解,對于學(xué)習(xí)Android的朋友具有一定的參考價值,有需要可以可以了解一下。
    2016-11-11
  • Android實現(xiàn)頁面滑動切換動畫

    Android實現(xiàn)頁面滑動切換動畫

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)頁面滑動切換動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android studio實現(xiàn)菜單效果

    Android studio實現(xiàn)菜單效果

    這篇文章主要為大家詳細(xì)介紹了Android studio實現(xiàn)菜單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android BroadcastReceiver實現(xiàn)網(wǎng)絡(luò)狀態(tài)實時監(jiān)聽

    Android BroadcastReceiver實現(xiàn)網(wǎng)絡(luò)狀態(tài)實時監(jiān)聽

    這篇文章主要為大家詳細(xì)介紹了Android BroadcastReceiver實現(xiàn)網(wǎng)絡(luò)狀態(tài)實時監(jiān)聽,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android?studio實現(xiàn)簡單計算器的編寫

    Android?studio實現(xiàn)簡單計算器的編寫

    這篇文章主要為大家詳細(xì)介紹了Android?studio實現(xiàn)簡單計算器的編寫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android中WebView實現(xiàn)點擊超鏈接啟動QQ的方法

    Android中WebView實現(xiàn)點擊超鏈接啟動QQ的方法

    這篇文章主要給大家介紹了在Android中WebView如何實現(xiàn)點擊超鏈接啟動QQ的方法,文中給出了詳細(xì)的示例代碼,相信對大家的學(xué)習(xí)或者工作具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04

最新評論

漳州市| 开封市| 古交市| 商都县| 库尔勒市| 陵川县| 闻喜县| 大邑县| 石泉县| 白沙| 唐山市| 龙泉市| 崇左市| 武宣县| 石首市| 刚察县| 武威市| 崇左市| 徐州市| 苏尼特右旗| 庄浪县| 土默特左旗| 中卫市| 思南县| 邹平县| 武邑县| 甘洛县| 灵寿县| 南和县| 澄江县| 溧水县| 视频| 儋州市| 蓬安县| 屏东县| 平远县| 邵阳市| 礼泉县| 西宁市| 潍坊市| 竹溪县|