前言
在日常开发中,我们经常会在 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<ALibrary> {
override fun create(context: Context): ALibrary {
ALibrary.initData(context)
return ALibrary
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
- create:在里面进行库的初始化,并且返回库的实体类。
- dependencies:ALibrary 的初始化可能依赖于其它库,例如 BLibrary,那么就需要在 dependencies 中返回含 BLibrary 列表,具体后续再详细举例说明,现在先填
emptyList()
,也就是没有依赖其它库。
当然,直接这样创建 ALibraryInitializer 还是不够的,还需要一个桥梁来让 App Startup
知道,所以我们还需要在 AndroidManifest.xml
中进行配置:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.bjsdm.testkotlin.ALibraryInitializer"
android:value="androidx.startup" />
</provider>
最主要的是更改 meta-data
的 name 的值,改为 ALibraryInitializer 的全路径。
运行,就能看到输出结果了:
I/System.out: 初始化 ALibrary 成功
初始化依赖
下面我们来讲解下 dependencies 的使用。
首先,我们先准备 BLibrary 和 BLibraryInitializer:
object BLibrary {
fun initData(context: Context){
println("初始化 BLibrary 成功")
}
}
class BLibraryInitializer : Initializer<BLibrary> {
override fun create(context: Context): BLibrary {
BLibrary.initData(context)
return BLibrary
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
然后修改下 ALibraryInitializer:
class ALibraryInitializer : Initializer<ALibrary> {
override fun create(context: Context): ALibrary {
ALibrary.initData(context)
return ALibrary
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return listOf(BLibraryInitializer::class.java) // <- 修改了这里
}
}
然后运行:
I/System.out: 初始化 BLibrary 成功
I/System.out: 初始化 ALibrary 成功
需要注意的是:
- BLibrary 比 ALibrary 提前初始化
- BLibraryInitializer 无需在
AndroidManifest.xml
中进行声明。
移除初始化
使用 App Startup 还有一个优势,就是假如引用的库使用了 App Startup 进行初始化,默认情况下是启动 App 后就自动初始化了,但是若我们不希望其初始化,可以在 AndroidManifest.xml
中进行配置:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.bjsdm.testkotlin.ALibraryInitializer"
tools:node="remove" />
</provider>
核心还是在于要修改 meta-data
的 name 的值,其余的都不需要改动。
但是由于我们通过以上步骤移除了库的初始化,那么岂不是不能再次进行该库了初始化了吗?
当然也不是,我们可以通过手动的方式进行初始化:
AppInitializer.getInstance(context).initializeComponent(ALibraryInitializer::class.java)