因为 App Startup
需要有使用到 ContentProvider 做初始化的场景,所以我们需要模拟那种使用 ContentProvider 做初始化的库。这里我选择使用官方文档中使用的 WorkManager
,在项目中导入:
dependencies {
def work_version = “2.4.0”
implementation “androidx.work:work-runtime:$work_version”
implementation “androidx.work:work-runtime-ktx:$work_version”
}
然后我们可以在 WorkManager 的jar包中找到他的 AndroidManifest.xml
,这里面就有 <provider>
标签:
可以看下 WorkManagerInitializer
的代码:
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
public class WorkManagerInitializer extends ContentProvider {
@Override
public boolean onCreate() {
// 初始化操作
WorkManager.initialize(getContext(), new Configuration.Builder().build());
return true;
}
…
}
也就是说 WorkManager
库是典型的使用 ContentProvider 来做初始化工作的库。我们假设自己是 WorkManager 的设计者,接下来就是用 App Startup 来优化这个库。
我们先来配置 App Startup,首先导入:
implementation “androidx.startup:startup-runtime:1.0.0”
App Startup提供了一个接口 Initializer<T>
,它用于执行初始化:
public interface Initializer {
@NonNull
T create(@NonNull Context context);
@NonNull
List<Class<? extends Initializer<?>>> dependencies();
}
该接口有两个方法:
T create(@NonNull Context context)
该方法用来做初始化的工作,就是我们做 .init()
的地方
List<Class<? extends Initializer<?>>> dependencies()
该组件在初始化时,需要依赖哪些组件的初始化,返回一个列表,这个列表里的组件都实现 Initializer
接口
也就是说,这个方法可以用来决定初始化顺序
假如我们要将 WorkManager 写入到我们 App Startup 的启动优化项里,那我们需要给其实现这个接口:
class WorkManagerInitializer : Initializer {
override fun create(context: Context) {