【Android Jetpack】使用App Startup来确保各类组件/第三方库初始化成功

1,552 阅读1分钟

前言

最近的开发发现了一个奇怪的问题,调用同事开发的组件获取到的key为空值。在默认的Application的onCreat里面初始化并一定能保证context已经被init,使用App Startup的话就可以完美避免这个问题了。而且有的第三方库是使用ContentProvider启动的,ContentProvider过多就会影响启动时间,App Startup可以合并所有用于初始化的ContentProvider,减少ContentProvider的创建,并且能全局管理。

使用

导入依赖

implementation("androidx.startup:startup-runtime:1.1.1")

Initializer

Initializer接口是 Startup 封装的组件接口,用于指定组件的初始化逻辑和初始化顺序

public interface Initializer<T> {

    /**
     * 初始化操作,返回的初始化结果将被缓存,其中context参数是 Application
     */
    @NonNull
    T create(@NonNull Context context);

    /**
     * 依赖关系,返回值是一个依赖组件的列表
     * 如果不需要依赖于其它组件,返回一个空列表。App Startup 在初始化当前组件时,会保证所依赖的组件已经完成初始化。
     */
    @NonNull
    List<Class<? extends Initializer<?>>> dependencies();
}

比如:

class AppInitializer : Initializer<Unit> {

    //在create方法中执行要初始化的代码
    override fun create(context: Context) {
       //要初始化的组件/第三方库
    }

    override fun dependencies(): MutableList<Class<out Initializer<*>>> {
        return mutableListOf()
    }
}

自动初始化

前文有说过,App Startup会提供一个ContentProvider用来初始化,所以我们需要在AndroidManifest中进行声明。InitializationProvider 就是App Startup用来提供合并初始化的。

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data
        android:name="com.**.**.AppInitializer" //AppInitializer的路径
        android:value="androidx.startup" />
</provider>

以上便是App Startup的简单用法了