Jetpack之Startup - xiaoniudonghe2015/Android-Java-Code-Style GitHub Wiki
App Startup库提供了一种直接,高效的方法来在应用程序启动时初始化组件。 库开发人员和应用程序开发人员都可以使用App Startup简化启动顺序并显式设置初始化顺序。
App Startup允许您定义共享单个内容提供程序的组件初始化程序,而无需为需要初始化的每个组件定义单独的内容提供程序。 这可以大大缩短应用启动时间。
dependencies {
implementation "androidx.startup:startup-runtime:1.0.0-alpha01"
}应用程序和库通常依赖于应用程序启动时立即初始化组件。您可以通过使用内容提供程序初始化每个依赖关系来满足此需求,但是内容提供程序的实例化成本很高,并且可能不必要地减慢启动顺序。此外,Android会以不确定的顺序初始化内容提供者。应用程序启动提供了一种更高效的方法,可在应用程序启动时初始化组件并显式定义其依赖关系。
要使用App Startup在启动时自动初始化组件,必须为应用程序需要初始化的每个组件定义一个组件初始化程序。
您可以通过创建实现Initializer 接口的类来定义每个组件初始化程序。该接口定义了两个重要的方法:
create()方法,其中包含初始化组件并返回T的实例的所有必需操作。
dependency()方法,返回初始化程序依赖的其他Initializer 对象的列表。您可以使用此方法来控制应用程序在启动时运行初始化程序的顺序。 例如,假设您的应用程序依赖于WorkManager,并且需要在启动时对其进行初始化。定义一个实现Initializer 的WorkManagerInitializer类:
// 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();
}
}dependency()方法返回一个空列表,因为WorkManager不依赖任何其他库。
假设您的应用程序还依赖于名为ExampleLogger的库,而该库又依赖于WorkManager。 这种依赖性意味着您需要确保App Startup首先初始化WorkManager。 定义一个实现Initializer 的ExampleLoggerInitializer类:
// 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清单条目下的条目来发现组件初始化程序。 然后,App Startup为其已发现的所有初始化程序调用dependencies()方法。
这意味着为了使组件启动程序可被App Startup发现,必须满足以下条件之一:
组件初始化程序在InitializationProvider清单条目下具有一个对应的条目。
组件初始值设定项已通过可发现的初始值设定项在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添加条目,因为WorkManagerInitializer是ExampleLoggerInitializer的依赖项。 这意味着如果ExampleLoggerInitializer是可发现的,则WorkManagerInitializer也是如此。
tools:node =“ merge”属性可确保清单合并工具正确解析所有冲突条目。
通常,当您使用App Startup时,InitializationProvider对象使用名为AppInitializer的实体在应用程序启动时自动发现并运行组件初始化程序。 但是,您也可以直接使用AppInitializer来手动初始化应用程序在启动时不需要的组件。 这称为延迟初始化,它可以帮助最小化启动成本。
您必须首先对要手动初始化的所有组件禁用自动初始化。
要禁用单个组件的自动初始化,请从清单中删除该组件的初始化程序的条目。
例如,将以下内容添加到清单文件中将禁用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);由于WorkManager是ExampleLogger的依赖项,因此App Startup也将初始化WorkManager。