美文网首页
和Jayce一起学习 Jetpack -- startup的用法

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

作者: 帅不过王力宏 | 来源:发表于2020-08-27 18:04 被阅读0次

    和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> 接口。该接口有如下两个方法:

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

    以workmanager举例说明

    // 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 直接返回一个空的list

    有依赖的组件的创建

    // 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);
        }
    }
    

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

    manifest的规范

    startup 库依赖与InitializationProvider

    <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>
    

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

    startup的另一种用法

    首先在xml中这样定义

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

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

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

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

    相关文章

      网友评论

          本文标题:和Jayce一起学习 Jetpack -- startup的用法

          本文链接:https://www.haomeiwen.com/subject/oalcsktx.html