應用程式啟動 Android Jetpack 的一部分。
應用程式啟動程式庫可讓您以簡單、有效率的方式初始化應用程式 元件。程式庫開發人員和應用程式開發人員 可以使用應用程式啟動程序簡化啟動序列並明確設定順序 和初始化時一樣。
您不必為每個元件定義個別的內容供應器 初始化之後,App Startup 可讓您定義共用元件的元件初始化器 單一內容供應器這可以大幅縮短應用程式的啟動時間。
設定
如要在程式庫或應用程式中使用 Jetpack Startup,請將以下內容新增至 Gradle 檔案:
Groovy
dependencies { implementation "androidx.startup:startup-runtime:1.2.0" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.2.0") }
在應用程式啟動時初始化元件
應用程式和程式庫通常需要在下列情況中立即將元件初始化 啟動應用程式這時可以使用內容供應器 初始化每個依附元件,但內容供應器執行個體化的成本高昂 因此可能會拖慢啟動序列,不必要的浪費。此外,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()方法的 原本就已偵測到的初始化器。
請再次思考使用 WorkManagerInitializer 和
ExampleLoggerInitializer。為了確保應用程式啟動程序能
初始化工具,請將以下內容加入資訊清單檔案:
<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> 項目,
因為 WorkManagerInitializer 是 ExampleLoggerInitializer 的依附元件。
這表示如果 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

- 報告問題,幫助我們修正錯誤。 ,瞭解如何調查及移除這項存取權。
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 應用程式架構:資料層 - 使用 WorkManager 安排工作 - Android 開發人員
- 應用程式架構:資料層 - DataStore - Android 開發人員