Jetpack之Startup - xiaoniudonghe2015/Android-Java-Code-Style GitHub Wiki

1.App Startup

App Startup库提供了一种直接,高效的方法来在应用程序启动时初始化组件。 库开发人员和应用程序开发人员都可以使用App Startup简化启动顺序并显式设置初始化顺序。

App Startup允许您定义共享单个内容提供程序的组件初始化程序,而无需为需要初始化的每个组件定义单独的内容提供程序。 这可以大大缩短应用启动时间。

2.添加依赖

dependencies {
    implementation "androidx.startup:startup-runtime:1.0.0-alpha01"
}

3.在应用启动时初始化组件

应用程序和库通常依赖于应用程序启动时立即初始化组件。您可以通过使用内容提供程序初始化每个依赖关系来满足此需求,但是内容提供程序的实例化成本很高,并且可能不必要地减慢启动顺序。此外,Android会以不确定的顺序初始化内容提供者。应用程序启动提供了一种更高效的方法,可在应用程序启动时初始化组件并显式定义其依赖关系。

要使用App Startup在启动时自动初始化组件,必须为应用程序需要初始化的每个组件定义一个组件初始化程序。

4.实现组件初始化器

您可以通过创建实现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。

注意:如果您以前使用内容提供程序来初始化应用程序中的组件,请确保在使用“应用程序启动”时删除这些内容提供程序。

5.设置清单条目

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”属性可确保清单合并工具正确解析所有冲突条目。

6.手动初始化组件

通常,当您使用App Startup时,InitializationProvider对象使用名为AppInitializer的实体在应用程序启动时自动发现并运行组件初始化程序。 但是,您也可以直接使用AppInitializer来手动初始化应用程序在启动时不需要的组件。 这称为延迟初始化,它可以帮助最小化启动成本。

您必须首先对要手动初始化的所有组件禁用自动初始化。

7.禁用单个组件的自动初始化

要禁用单个组件的自动初始化,请从清单中删除该组件的初始化程序的条目。

例如,将以下内容添加到清单文件中将禁用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”而不是简单地删除条目,以确保合并工具还从所有其他合并清单文件中删除了条目。

注意:禁用组件的自动初始化也会禁用该组件的依赖项的自动初始化。

8.禁用所有组件的自动初始化

要禁用所有自动初始化,请从清单中删除InitializationProvider的整个条目:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />

9.手动调用组件初始化程序

如果为组件禁用了自动初始化,则可以使用AppInitializer手动初始化该组件及其依赖项。

例如,以下代码调用AppInitializer并手动初始化ExampleLogger:

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer.class);

由于WorkManager是ExampleLogger的依赖项,因此App Startup也将初始化WorkManager。

⚠️ **GitHub.com Fallback** ⚠️