Skip to content

App Startup 应用启动

源: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)