前言
最近的开发发现了一个奇怪的问题,调用同事开发的组件获取到的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的简单用法了