應用程式啟動 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()
方法的 原本就已偵測到的初始化器。
請再次思考使用 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 開發人員