Jetpack App Startup库的使用


特点

  • 应用启动时进行高性能的初始化
  • 明确定义各种初始化的依赖关系

使用

先添加依赖:

implementation("androidx.startup:startup-runtime:1.0.0-beta01")

你得为每一个需要初始化的组件实现一个Initializer.

public interface Initializer<T> {

    @NonNull
    T create(@NonNull Context context);

    @NonNull
    List<Class<? extends Initializer<?>>> dependencies();
}

可以看到,就只有两个方法:

  • create() : 用于执行初始化操作
  • dependencies() : 用于配置依赖
// 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)
    }
}

从上面可以看出,一般都需要返回组件的对象.

从这一点上来看,这个AppStart库比较鸡肋,因为很多库都不是返回一个单例类的实例的.

自动初始化

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

需要在manifest文件中进行配置.

手动初始化

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

或者

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

其实就是node属性控制的.

总结

源码比较简单,就只有几个类而已,没什么好说的.

总的来说,app start库并不值得推荐:

  • 性能

    这个库使用的依然是ContentProvider,而且是基于反射的,性能并不比直接使用ContentProvider高

  • 易用性

    需要再Manifest中配置,并不是很方便

唯一值得借鉴的,也就是依赖关系与初始化的顺序封装了.

参考文章

  1. https://developer.android.com/topic/libraries/app-startup?hl=zh-cn

文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
  目录