App Startup 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 會以未決定的順序初始化內容供應器。應用程式啟動可讓您在應用程式啟動時,以更有效的方式初始化元件,並明確定義其依附元件。
如要使用 App Startup 自動初始化元件,您必須為應用程式初始化的每個元件定義元件初始化器。
實作元件初始化器
您可以建立實作 Initializer<T>
介面的類別,藉此定義每個元件初始化器。這個介面定義了兩個重要方法:
create()
方法,包含初始化元件並傳回T
執行個體所需的所有必要作業。dependencies()
方法,會傳回初始化器依附的其他Initializer<T>
物件清單。您可以使用這個方法控制應用程式啟動時執行初始化器的順序。
舉例來說,假設應用程式依附 WorkManager
,且需要在啟動時初始化應用程式。定義實作 Initializer<WorkManager>
的 WorkManagerInitializer
類別:
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
。此依附元件代表您需要先確認應用程式啟動會初始化 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
。
設定資訊清單項目
應用程式 Startup 包含一個名為 InitializationProvider
的特殊內容供應器,用於探索及呼叫元件初始化器。應用程式 Startup 會先檢查 InitializationProvider
資訊清單項目底下的 <meta-data>
項目,藉此探索元件初始化器。接著,應用程式啟動程序會針對已找到的任何初始化器呼叫 dependencies()
方法。
也就是說,為了讓 AppStartup 偵測到元件初始化器,必須滿足下列其中一項條件:
- 元件初始化器在
InitializationProvider
資訊清單項目下擁有對應的<meta-data>
項目。 - 元件初始化器會列在
dependencies()
方法中,且該初始化器已可供偵測。
請再次考慮包含 WorkManagerInitializer
和 ExampleLoggerInitializer
的範例。為確保 App Startup 能夠找到這些初始化器,請在資訊清單檔案中加入以下內容:
<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 開發人員