官方文档:https://developer.android.com/topic/libraries/app-startup
App Startup 库提供了一种在应用程序启动时初始化组件的简单、高效的方法。库开发人员和应用程序开发人员都可以使用 App Startup 来简化启动顺序并明确设置初始化顺序。
App Startup 允许您定义共享的单个 Content Provider 的组件初始化程序,而不是为您需要初始化的每个组件定义单独的 Content Provider。这可以显着改善应用程序启动时间。
配置
要在您的库或应用程序中使用 Jetpack Startup,请将以下内容添加到您的 Gradle 文件中:
dependencies {
implementation "androidx.startup:startup-runtime:1.1.1"
}
在应用启动时初始化组件
应用程序和库通常依赖于在应用程序启动时立即初始化组件。您可以通过使用 Content Provider 来初始化每个依赖项来满足此需求,但 Content Provider 的实例化成本很高,并且可能会不必要地减慢启动。此外,Android 以不确定的顺序初始化内容提供程序。App Startup 提供了一种更高效的方式来在应用启动时初始化组件并明确定义它们的依赖关系。
要使用 App Startup 在启动时自动初始化组件,您必须为应用需要初始化的每个组件定义一个组件初始化器。
实现组件初始化器
您可以通过创建一个实现 Initializer<T>接口的类来定义每个组件初始化程序。这个接口定义了两个重要的方法:
- create()方法,包含初始化组件所需的所有操作并返回T实例。
- dependencies()方法,返回初始化程序所依赖的其他 Initializer<T>对象的列表。您可以使用此方法来控制应用程序在启动时运行初始化程序的顺序。
例如,假设您的应用依赖 WorkManager并需要在启动时对其进行初始化。定义一个实现了Initializer<WorkManager>的类WorkManagerInitializer:
// 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()
}
}
该dependencies()方法返回一个空列表,因为WorkManager不依赖于任何其他库。
假设您的应用程序还依赖于一个名为 ExampleLogger的库,而该库又依赖于WorkManager。 这种依赖意味着您需要确保 App Startup 首先初始化WorkManager。定义一个实现了Initializer<ExampleLogger>的类 ExampleLoggerInitializer:
// 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)
}
}
因为您把WorkManagerInitializer包含在dependencies()方法中,所以 App Startup 在ExampleLogger之前初始化WorkManager。
注意: 如果您之前使用 Content Provider 来初始化应用程序中的组件,请确保在使用 App Startup 时删除这些 Content Provider。
设置清单条目
App Startup 包含一个名为InitializationProvider的特殊 Content Provider ,用于发现和调用您的组件初始化程序。App Startup 通过首先检查清单条目InitializationProvider下的<meta-data>条目来发现组件初始化程序。然后,App Startup 调用所有已经发现的初始化程序的 dependencies()方法。
这意味着,要让 App Startup 发现组件初始化程序,必须满足以下条件之一:
- 组件初始化器在清单条目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也是。
转载请说明出处:https://blog.csdn.net/hegan2010/article/details/124666445
tools:node="merge"属性确保清单合并工具正确处理任何冲突条目。
运行 lint 检查
App Startup 库包含一组 lint 规则,可用于检查是否正确定义了组件初始化程序。您可以通过从命令行运行./gradlew :app:lintDebug来执行这些 lint 检查。
手动初始化组件
通常,当您使用 App Startup 时,该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:
AppInitializer.getInstance(context)
.initializeComponent(ExampleLoggerInitializer::class.java)
结果,App Startup 也会初始化WorkManager,因为WorkManager它是ExampleLogger的依赖。