App Startup 应用启动
App Startup 是一个 Android Jetpack 库,旨在提供一种简单、高效的方法在应用程序启动时初始化组件。库开发者和应用开发者都可以使用 App Startup 来简化启动序列并显式设置初始化顺序。
相比于每个库都定义自己的 ContentProvider 来进行初始化(这会拖慢启动速度),App Startup 允许所有库共享同一个 ContentProvider。
1. 添加依赖
kotlin
[versions]
startup = "1.1.1"
[libraries]
androidx-startup = { group = "androidx.startup", name = "startup-runtime", version.ref = "startup" }kotlin
dependencies {
implementation(libs.androidx.startup)
}2. 实现 Initializer
你需要为你想要初始化的每个组件定义一个 Initializer<T> 接口的实现。
假设我们有一个 ExampleLogger 库需要初始化:
kotlin
// ExampleLogger.kt
class ExampleLogger {
fun initialize(context: Context) {
// 初始化逻辑
}
}创建 ExampleLoggerInitializer:
kotlin
import android.content.Context
import androidx.startup.Initializer
class ExampleLoggerInitializer : Initializer<ExampleLogger> {
// 1. 执行初始化操作,并返回结果实例
override fun create(context: Context): ExampleLogger {
val logger = ExampleLogger()
logger.initialize(context)
return logger
}
// 2. 定义当前初始化器依赖的其他 Initializer
// 如果没有依赖,返回空列表
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}处理依赖关系
假设还有一个 ExampleWorkManager 需要在 ExampleLogger 初始化之后才能初始化:
kotlin
class ExampleWorkManagerInitializer : Initializer<ExampleWorkManager> {
override fun create(context: Context): ExampleWorkManager {
// App Startup 会自动先初始化依赖项
// 这里可以安全地使用 ExampleLogger,虽然这里没有直接引用它
return ExampleWorkManager()
}
override fun dependencies(): List<Class<out Initializer<*>>> {
// 声明依赖于 ExampleLoggerInitializer
return listOf(ExampleLoggerInitializer::class.java)
}
}3. 在 Manifest 中注册
为了让 App Startup 自动发现并运行你的 Initializer,需要在 AndroidManifest.xml 中添加 <meta-data> 条目到 InitializationProvider 中。
xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.app">
<application ...>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- 注册 Initializer -->
<meta-data
android:name="com.example.app.ExampleWorkManagerInitializer"
android:value="androidx.startup" />
<!-- 注意:不需要显式注册 ExampleLoggerInitializer,
因为它被 ExampleWorkManagerInitializer 依赖,会自动被发现。
当然,显式写出来也是可以的。 -->
</provider>
</application>
</manifest>4. 手动初始化 (可选)
如果你不希望在启动时自动初始化某个组件(例如为了懒加载),可以禁用自动初始化并手动调用。
禁用自动初始化
在 Manifest 中使用 tools:node="remove":
xml
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.app.ExampleLoggerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>如果要完全禁用 App Startup 的所有自动初始化:
xml
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />执行手动初始化
kotlin
import androidx.startup.AppInitializer
val result = AppInitializer.getInstance(context)
.initializeComponent(ExampleLoggerInitializer::class.java)