应用启动 属于 Android Jetpack。
App Startup 库提供了一种直接、高效的方式来在应用启动时初始化组件。库开发者和应用开发者都可以使用 App Startup 来简化启动序列并明确设置初始化顺序。
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 会以不确定的顺序初始化内容提供程序。App Startup 提供了一种更高效的方式来在应用启动时初始化组件,并明确定义它们的依赖项。
要使用 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
。这种依赖关系意味着您需要确保 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
,App Startup 会在初始化 ExampleLogger
之前初始化 WorkManager
。
设置清单条目
App Startup 包含一个名为 InitializationProvider
的特殊内容提供程序,它用于发现和调用您的组件初始化程序。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
也是可被发现的。
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
Kotlin
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer::class.java)
Java
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer.class);
因此,App Startup 也会初始化 WorkManager
,因为 WorkManager
是 ExampleLogger
的依赖项。
提供反馈
通过以下资源与我们分享您的反馈和想法
- 问题跟踪器
- 报告问题,以便我们修复错误。
为您推荐
- 注意:禁用 JavaScript 时会显示链接文本
- 应用架构:数据层 - 使用 WorkManager 安排任务 - Android 开发者
- 应用架构:数据层 - DataStore - Android 开发者