應用程式啟動 Android Jetpack 的一部分。

應用程式啟動程式庫可讓您以簡單、有效率的方式初始化應用程式 元件。程式庫開發人員和應用程式開發人員 可以使用應用程式啟動程序簡化啟動序列並明確設定順序 和初始化時一樣。

您不必為每個元件定義個別的內容供應器 初始化之後,App Startup 可讓您定義共用元件的元件初始化器 單一內容供應器這可以大幅縮短應用程式的啟動時間。

設定

如要在程式庫或應用程式中使用 Jetpack Startup,請將以下內容新增至 Gradle 檔案:

Groovy

dependencies {
    implementation "androidx.startup:startup-runtime:1.1.1"
}

Kotlin

dependencies {
    implementation("androidx.startup:startup-runtime:1.1.1")
}

在應用程式啟動時初始化元件

應用程式和程式庫通常需要在下列情況中立即將元件初始化 啟動應用程式這時可以使用內容供應器 初始化每個依附元件,但內容供應器執行個體化的成本高昂 因此可能會拖慢啟動序列,不必要的浪費。此外,Android 以不明順序初始化內容供應器。應用程式啟動程序提供了 在應用程式啟動時,以更高效的方式初始化元件, 定義依附元件

如要使用應用程式啟動程序在啟動時自動初始化元件,您必須 為每個應用程式需要的元件定義元件初始化器 初始化。

實作元件初始化器

您可以建立實作 Initializer<T> 介面。 這個介面定義了兩個重要方法:

  • create() 方法,其中包含 初始化元件並傳回 T 的例項。
  • dependencies() 方法,用於傳回另一個 初始化器依附的 Initializer<T> 物件。您可以使用 方法,控制應用程式在啟動時執行初始化器的順序。

舉例來說,假設您的應用程式需要使用 WorkManager,並且需要 並初始化定義 WorkManagerInitializer 類別,該類別會包含以下內容 實作 Initializer<WorkManager>

Kotlin

// Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
    override fun create(context: Context): WorkManager {
        val configuration = Configuration.Builder().build()
        WorkManager.initialize(context, configuration)
        return WorkManager.getInstance(context)
    }
    override fun dependencies(): List<Class<out Initializer<*>>> {
        // No dependencies on other libraries.
        return emptyList()
    }
}

Java

// Initializes WorkManager.
class WorkManagerInitializer implements Initializer<WorkManager> {

    @Override
    public WorkManager create(Context context) {
        Configuration configuration = Configuration.Builder().build();
        WorkManager.initialize(context, configuration);
        return WorkManager.getInstance(context);
    }

    @Override
    public List<Class<Initializer<?>>> dependencies() {
        // No dependencies on other libraries.
        return emptyList();
    }

}

dependencies() 方法會傳回空白清單,因為 WorkManager 不會 必須依賴其他程式庫

假設應用程式也依附於名為 ExampleLogger 的程式庫, 開啟取決於WorkManager。這個依附元件意味著您必須確保 App Startup 會先初始化 WorkManager。定義 實作 Initializer<ExampleLogger>ExampleLoggerInitializer 類別:

Kotlin

// Initializes ExampleLogger.
class ExampleLoggerInitializer : Initializer<ExampleLogger> {
    override fun create(context: Context): ExampleLogger {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context))
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return listOf(WorkManagerInitializer::class.java)
    }
}

Java

// Initializes ExampleLogger.
class ExampleLoggerInitializer implements Initializer<ExampleLogger> {

    @Override
    public ExampleLogger create(Context context) {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context));
    }

    @Override
    public List<Class<Initializer<?>>> dependencies() {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return Arrays.asList(WorkManagerInitializer.class);
    }
}

由於您在 dependencies() 方法中加入 WorkManagerInitializer,因此應用程式 啟動作業會在 ExampleLogger 之前初始化 WorkManager

設定資訊清單項目

應用程式啟動程序包含一個名為 InitializationProvider 的特殊內容供應器 探索及呼叫元件初始化器。應用程式啟動 會先檢查 <meta-data> 項目,探索元件初始化器 在 InitializationProvider 資訊清單項目下。接著,App Startup 會呼叫 dependencies() 方法適用於已發現的任何初始化器。

這表示為了讓應用程式可以找到元件初始化器 啟動程序必須滿足下列任一條件:

  • 元件初始化器的結構底下,有一個對應的 <meta-data> 項目。 InitializationProvider 資訊清單項目。
  • 元件初始化器會列在 dependencies() 方法的 原本就已偵測到的初始化器。

請再次思考使用 WorkManagerInitializerExampleLoggerInitializer。為了確保應用程式啟動程序能 初始化工具,請將以下內容加入資訊清單檔案:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- This entry makes ExampleLoggerInitializer discoverable. -->
    <meta-data  android:name="com.example.ExampleLoggerInitializer"
          android:value="androidx.startup" />
</provider>

您無須為 WorkManagerInitializer 新增 <meta-data> 項目, 因為 WorkManagerInitializerExampleLoggerInitializer 的依附元件。 這表示如果 ExampleLoggerInitializer 可供偵測,則 WorkManagerInitializer

tools:node="merge" 屬性可確保資訊清單合併工具 工具能正確解析任何相衝突的項目。

執行 Lint 檢查

應用程式啟動程式庫提供一組 Lint 規則,方便您檢查 您是否已正確定義元件初始化器。您可以在 從指令列執行 ./gradlew :app:lintDebug,藉此執行這些 Lint 檢查。

手動初始化元件

一般而言,使用應用程式啟動程序時,InitializationProvider 物件會使用 已呼叫實體 AppInitializer 到 在應用程式啟動時,自動探索並執行元件初始化器。 不過,您也可以直接使用 AppInitializer 啟動應用程式啟動時不需要的元件。這種訓練方式稱為 延遲初始化,協助將啟動成本降至最低。

您必須先為所需的元件停用自動初始化功能 來手動初始化。

停用個別元件的自動初始化功能

如要為單一元件停用自動初始化,請移除 資訊清單為該元件初始化器的 <meta-data> 項目。

舉例來說,在資訊清單檔案中加入下列程式碼,系統就會停用自動 ExampleLogger 的初始化:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="com.example.ExampleLoggerInitializer"
              tools:node="remove" />
</provider>

您可以在項目中使用 tools:node="remove",而不只是移除項目 為了確保合併工具也會將項目 合併的資訊清單檔案

停用所有元件的自動初始化功能

如要停用所有自動初始化功能,請移除以下項目的整個項目: 資訊清單中的 InitializationProvider

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />

手動呼叫元件初始化器

如果元件已停用自動初始化功能,您可以使用 AppInitializer,手動初始化該元件及其依附元件。

舉例來說,下列程式碼會呼叫 AppInitializer 並手動初始化 ExampleLogger:

Kotlin

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer::class.java)

Java

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer.class);

因此,應用程式啟動程序也會初始化 WorkManager,因為 WorkManager ExampleLogger 的依附元件。

提供意見

歡迎透過下列資源與我們分享意見和想法:

Issue Tracker
報告問題,幫助我們修正錯誤。
,瞭解如何調查及移除這項存取權。