欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

官網(wǎng)項目Jetpack?Startup庫學習

 更新時間:2023年02月01日 16:19:51   作者:kandra777  
這篇文章主要為大家介紹了官網(wǎng)項目Jetpack?Startup庫學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

簡單認識一下Startup

nowinandroid項目作為目前google官方來演示MAD(現(xiàn)代Android開發(fā)技術)的示例項目,里面大量依賴運用了jetpack包下的各種庫。通過分析學習這些庫在項中的實際使用可以幫助我們比直接閱讀庫的文檔來更好的理解和學習。希望通過學習后可以幫助到我們能熟練地在我們自己的項目中正確高效的使用到jetpack里面的各種強大庫。不廢話了,下面進入我們今天的正題——Startup

App Startup  |  Android Developers 官網(wǎng)的指南有興趣可以看看

我們今天不講原理,你只需知道這個庫比之前用多個content provider去實現(xiàn)初始化更高效,更精確,更顯性,也就是說能合并content provider提升app的啟動速度,能準確的控制初始化順序,能清晰的從代碼知道依賴關系。僅僅這些可能jym會說,我們項目不在乎那點啟動速度的提升,也沒有很多三方庫需要走初始化等,根本用不到這個庫。

是的,我之前也是這么理解的,但是通過nowinandroid項目發(fā)現(xiàn),有些jetpack內(nèi)的其他庫的初始化現(xiàn)在也交給Startup來完成了,這一點就很重要了。意味著我們可以少寫很多樣板代碼,少寫也意味著少犯錯。所以我覺的還是有必要單獨寫一篇文章來說說Startup

編寫初始化的代碼步驟很簡單主要就分3步:

  • 定義實現(xiàn)Initializer接口的實現(xiàn)類
  • 配置manifest
  • 自動或手動調(diào)用初始化操作

OK了!就這簡單3步,下面我們結合項目例子來看

項目代碼

  • 先看第一步
object Sync {
    // This method is a workaround to manually initialize the sync process instead of relying on
    // automatic initialization with Androidx Startup. It is called from the app module's
    // Application.onCreate() and should be only done once.
    fun initialize(context: Context) {
        AppInitializer.getInstance(context)
            .initializeComponent(SyncInitializer::class.java)
    }
}
internal const val SyncWorkName = "SyncWorkName"
/**
 * Registers work to sync the data layer periodically on app startup.
 */
class SyncInitializer : Initializer<Sync> {
    override fun create(context: Context): Sync {
        WorkManager.getInstance(context).apply {
            // Run sync on app startup and ensure only one sync worker runs at any time
            enqueueUniqueWork(
                SyncWorkName,
                ExistingWorkPolicy.KEEP,
                SyncWorker.startUpSyncWork(),
            )
        }
        return Sync
    }
    override fun dependencies(): List<Class<out Initializer<*>>> =
        listOf(WorkManagerInitializer::class.java)
}

定一個SyncInitializer類實現(xiàn)了泛型為SyncInitializer接口。需要重寫接口定義的兩個方法:

  •  create() 方法, 它包含初始化組件所需的所有操作,并返回一個Sync的實例.
  •  dependencies() 方法, 返回當前初始化器需要依賴的其他初始化器集合,我們可以用這個方法來變相的實現(xiàn)各個初始化器的執(zhí)行順序。

所以在create方法里面的執(zhí)行WorkManager.getInstance(context)方法是安全的。我們這篇只關注Startup所以我們只用知道在這個地方WorkManager做了些事情就行,后面會另開一篇單獨講WorkManager。為啥是安全的呢?因為在dependencies方法里面先執(zhí)行了WorkManagerInitializer::class.java初始化。我們再來看看這個類。

public final class WorkManagerInitializer implements Initializer<WorkManager> {
    private static final String TAG = Logger.tagWithPrefix("WrkMgrInitializer");
    @NonNull
    @Override
    public WorkManager create(@NonNull Context context) {
        // Initialize WorkManager with the default configuration.
        Logger.get().debug(TAG, "Initializing WorkManager with default configuration.");
        //這個地方已經(jīng)完成了單例的構建,后面再調(diào)用WorkManager.getInstance(context)獲取實例,否則報錯
        WorkManager.initialize(context, new Configuration.Builder().build());
        return WorkManager.getInstance(context);
    }
    @NonNull
    @Override
    public List<Class<? extends androidx.startup.Initializer<?>>> dependencies() {
        //這里WorkManager的初始化不需要其他初始化構造器,所以返回的是個空集合
        return Collections.emptyList();
    }
}

以上我們就把第一步走完了,現(xiàn)在再來看第二步

  • 再看第二步
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">
            <!--  TODO: b/2173216 Disable auto sync startup till it works well with instrumented tests   -->
            <meta-data
                android:name="com.google.samples.apps.nowinandroid.sync.initializers.SyncInitializer"
                android:value="androidx.startup"
                tools:node="remove" />
        </provider>
    </application>
</manifest>

這里需要注意的是tools:node="remove",在provider層級用的話是全局取消自動初始化,在meta-data層級用的話是單個組件取消自動初始化。例子展示的是單個組件取消自動初始化。另外注意的一點是被依賴的初始化組件是不需要再另外在manifest里面聲明的,這就是為什么WorkManagerInitializer沒有聲明。

  • 最后一步
@HiltAndroidApp 
class NiaApplication : Application(), ImageLoaderFactory {
    override fun onCreate() {
        super.onCreate()
        // Initialize Sync; the system responsible for keeping data in the app up to date.
        Sync.initialize(context = this)
    }
    /**
     * Since we're displaying SVGs in the app, Coil needs an ImageLoader which supports this
     * format. During Coil's initialization it will call `applicationContext.newImageLoader()` to
     * obtain an ImageLoader.
     *
     * @see <a  rel="external nofollow" >Coil</a>
     */
    override fun newImageLoader(): ImageLoader {
        return ImageLoader.Builder(this)
            .components {
                add(SvgDecoder.Factory())
            }
            .build()
    }
}

上面的代碼是app的Application,我們今天的重點是Startup,所以我們先不管其他的。只用看onCreate下的Sync.initialize(context = this)方法。

object Sync {
    // This method is a workaround to manually initialize the sync process instead of relying on
    // automatic initialization with Androidx Startup. It is called from the app module's
    // Application.onCreate() and should be only done once.
    fun initialize(context: Context) {
        AppInitializer.getInstance(context)
            .initializeComponent(SyncInitializer::class.java)
    }
}

AppInitializer.getInstance(context).initializeComponent(SyncInitializer::class.java)傳入SyncInitializer類,實現(xiàn)手動初始化完成。

以上就是nowinandroid項目對Startup庫的使用,并且上面我們也知道了我們自定義的初始化器在初始化的時候通過WorkManager做了些事情。那么下篇我們還是通過這個例子來看看nowinandroid是怎么使用WorkManager這個庫的,更多關于官網(wǎng)Jetpack Startup庫的資料請關注腳本之家其它相關文章!

相關文章

  • 自定義Adapter并通過布局泵LayoutInflater抓取layout模板編輯每一個item實現(xiàn)思路

    自定義Adapter并通過布局泵LayoutInflater抓取layout模板編輯每一個item實現(xiàn)思路

    自定義Adapter并通過布局泵LayoutInflater抓取layout模板編輯每一個item,下面我們開始學習這一篇的內(nèi)容,感興趣的朋友可以了解下哈
    2013-06-06
  • Android 超詳細SplashScreen入門教程

    Android 超詳細SplashScreen入門教程

    Android 12正式版即將發(fā)布,有一個非常顯著的視覺變化就是,Android 12強制給所有的App都增加了SplashScreen的功能。是的,即使你什么都不做,只要你的App安裝到了Android 12手機上,都會自動擁有這個新功能
    2022-03-03
  • Android滑動拼圖驗證碼控件使用方法詳解

    Android滑動拼圖驗證碼控件使用方法詳解

    這篇文章主要為大家詳細介紹了Android滑動拼圖驗證碼控件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android程序版本更新之通知欄更新下載安裝

    Android程序版本更新之通知欄更新下載安裝

    Android應用檢查版本更新后,在通知欄下載,更新下載進度,下載完成自動安裝。接下來通過本文給大家介紹Android程序版本更新之通知欄更新下載安裝的相關知識,需要的朋友參考下吧
    2016-03-03
  • Android布局實現(xiàn)圓角邊框效果

    Android布局實現(xiàn)圓角邊框效果

    這篇文章主要介紹了Android布局實現(xiàn)圓角邊框效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • android SDk中常用的java包介紹

    android SDk中常用的java包介紹

    在android的應用程序開發(fā)中,通常使用的是java語言,除了需要熟悉java語言的基礎知識之外,還需要了解android提供的擴展的java功能。android SDK中API提供一些擴展的java 類庫,類庫分為若干個包,每個包中包含若干個類
    2014-05-05
  • Android讀取本地圖庫與調(diào)用攝像頭拍攝

    Android讀取本地圖庫與調(diào)用攝像頭拍攝

    這篇文章主要為大家詳細介紹了Android讀取本地圖庫與調(diào)用攝像頭拍攝,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android簽名知識小結

    Android簽名知識小結

    不止一次有用到Android簽名相關的知識,每次都幾乎從零開始在Google上搜索找,不想在繼續(xù)這樣了,找了個時間好好整理了一下自己用到的一些碎片知識,于是乎放到這里,一是備忘,二是幫助別人
    2016-03-03
  • Android中 webView調(diào)用JS出錯的解決辦法

    Android中 webView調(diào)用JS出錯的解決辦法

    這篇文章主要介紹了Android中 webView調(diào)用JS出錯的解決辦法,需要的朋友可以參考下
    2015-01-01
  • Android使用onCreateOptionsMenu()創(chuàng)建菜單Menu的方法詳解

    Android使用onCreateOptionsMenu()創(chuàng)建菜單Menu的方法詳解

    這篇文章主要介紹了Android使用onCreateOptionsMenu()創(chuàng)建菜單Menu的方法,結合實例形式較為詳細的分析了Android基于onCreateOptionsMenu創(chuàng)建菜單的具體步驟與相關操作技巧,需要的朋友可以參考下
    2016-11-11

最新評論