在日常开发中,我们经常会在 Application 的 onCreate 进行库的初始化,就像这样:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
ALibrary.initData(this)
}
}
至于 ALibrary,我只是简单写个模拟类而已:
object ALibrary {
fun initData(context: Context){
println("初始化 ALibrary 成功")
}
}
在这篇文章中,我们尝试使用 App Startup 进行初始化。
首先我们需要添加依赖:
implementation "androidx.startup:startup-runtime:1.1.1"
具体的版本我们可以看看「App Startup 官方介绍」。
然后创建 Initializer 的继承类,并实现其 create(context: Context) 和 dependencies() 方法:
class ALibraryInitializer : Initializer {
override fun create(context: Context): ALibrary {
ALibrary.initData(context)
return ALibrary
}
override fun dependencies(): List>> {
return emptyList()
}
}
emptyList(),也就是没有依赖其它库。当然,直接这样创建 ALibraryInitializer 还是不够的,还需要一个桥梁来让 App Startup 知道,所以我们还需要在 AndroidManifest.xml 中进行配置:
最主要的是更改 meta-data 的 name 的值,改为 ALibraryInitializer 的全路径。
运行,就能看到输出结果了:
I/System.out: 初始化 ALibrary 成功
下面我们来讲解下 dependencies 的使用。
首先,我们先准备 BLibrary 和 BLibraryInitializer:
object BLibrary {
fun initData(context: Context){
println("初始化 BLibrary 成功")
}
}
class BLibraryInitializer : Initializer {
override fun create(context: Context): BLibrary {
BLibrary.initData(context)
return BLibrary
}
override fun dependencies(): List>> {
return emptyList()
}
}
然后修改下 ALibraryInitializer:
class ALibraryInitializer : Initializer {
override fun create(context: Context): ALibrary {
ALibrary.initData(context)
return ALibrary
}
override fun dependencies(): List>> {
return listOf(BLibraryInitializer::class.java) // <- 修改了这里
}
}
然后运行:
I/System.out: 初始化 BLibrary 成功
I/System.out: 初始化 ALibrary 成功
需要注意的是:
AndroidManifest.xml 中进行声明。使用 App Startup 还有一个优势,就是假如引用的库使用了 App Startup 进行初始化,默认情况下是启动 App 后就自动初始化了,但是若我们不希望其初始化,可以在 AndroidManifest.xml 中进行配置:
核心还是在于要修改 meta-data 的 name 的值,其余的都不需要改动。
但是由于我们通过以上步骤移除了库的初始化,那么岂不是不能再次进行该库了初始化了吗?
当然也不是,我们可以通过手动的方式进行初始化:
AppInitializer.getInstance(context).initializeComponent(ALibraryInitializer::class.java)