这是官方对于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" />
其次 调用这个方法,将会开始注册组件,而不会自动注册,同理,由于 workmangerinitializer
是ExampleLoggerInitializer
的依赖,所以这里会自动的创建workmangerinitializer
AppInitializer.getInstance(context)
.initializeComponent(ExampleLoggerInitializer.class);
哈哈哈哈哈哈是不是很神奇,下一章我们来查看下源码来弄懂这里面的神奇之处。
网友评论