和Jayce一起学习 Jetpack -- startup的用法

和Jayce一起学习Jetpack -- 开篇
Google 官方解释

这是官方对于startup这个库的解释。

App startup 库 提供了 一个直截了当、高性能的方式去初始化你的应用。第三方库和app的开发者都可以使用app startup这个库以数据流的方式去显示的安排启动的各个步骤。

app startup这个库允许你只创建一个contentprovider 去初始化你的各个 initializer,这将有助与提升你的app启动时间。

从这段话中,我们可以看到几个重要的点。

  • contentprovider
  • 数据流的方式,显示的安排各个启动的步骤

配置

配置在你的app或者library的moudle中的build.gradle 中

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

注册初始化组件

定义了一个默认的content provider,所有的 组件都由这个content provider的create 里面创建流程。
如果想要自动化的创建组件,需要在manifest中显示的写入你的组件。

组件的创建

实现 Initializer 接口。该接口有如下两个方法:

  • T create(Context)
    返回创建好的实例
  • dependencies()
    创建该组件之前需要创建的其他组件。

以workmanager举例说明

// Initializes WorkManager.
class WorkManagerInitializer implements Initializer {

    @Override
    public WorkManager create(Context context) {
        Configuration configuration = Configuration.Builder().build();
        WorkManager.initialize(context, configuration);
        return WorkManager.getInstance(context);
    }

    @Override
    public List>> dependencies() {
        // No dependencies on other libraries.
        return emptyList();
    }

}

这个例子中间,我们可以看到由于不需要依赖与别的组件,dependencies 直接返回一个空的list

有依赖的组件的创建

// Initializes ExampleLogger.
class ExampleLoggerInitializer implements Initializer {

    @Override
    public ExampleLogger create(Context context) {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context));
    }

    @Override
    public List>> dependencies() {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return Arrays.asList(WorkManagerInitializer.class);
    }
}

这里在ExampleLogger 的create期间,workmanager已经创建好了,在这里可以直接是使用。

manifest的规范

startup 库依赖与InitializationProvider


    
    

再在provider的metadata中定义好自己的Initializer。就会自动注册组件。

startup的另一种用法

首先在xml中这样定义


其次 调用这个方法,将会开始注册组件,而不会自动注册,同理,由于 workmangerinitializerExampleLoggerInitializer 的依赖,所以这里会自动的创建workmangerinitializer

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

哈哈哈哈哈哈是不是很神奇,下一章我们来查看下源码来弄懂这里面的神奇之处。

你可能感兴趣的:(和Jayce一起学习 Jetpack -- startup的用法)