App Startup
App Startup 使用
引入
1
2
3
| dependencies {
implementation "androidx.startup:startup-runtime:1.1.1"
}
|
自动初始化
- 自定义实现
Initializer
类
1
2
3
4
5
6
7
8
9
10
11
12
| // Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
override fun create(context: Context): WorkManager {
val configuration = Configuration.Builder().build()
WorkManager.initialize(context, configuration)
return WorkManager.getInstance(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
// No dependencies on other libraries.
return emptyList()
}
}
|
- T create(@NonNull Context context) 初始化一个组件,返回给 Application
- dependencies() 如果需要依赖其他的
Initializer
,重写 dependencies 方法,返回即可。如下面的 ExampleLoggerInitializer
依赖于 WorkManagerInitializer
- 定义
ExampleLoggerInitializer
类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| // 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)
}
}
class ExampleLogger(val workManager: WorkManager){
}
|
- 在 AndroidManifest 里面配置自定义的
InitializationProvider
1
2
3
4
5
6
7
8
9
| <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.xj.anchortask.appstartup.ExampleLoggerInitializer"
android:value="androidx.startup" />
</provider>
|
它是有固定格式的,配置者只需要配置 meta-data
中的 name
即可,这里的 name 是我们自定义的 Initializer 全路径。
手动初始化
- AndroidManifest 移除
InitializationProvider
或设置为 tools:node=remove
1
2
3
4
5
6
7
8
9
10
| <provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="me.hacket.assistant.samples.google.architecture.appstartup.ExampleLoggerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
|
- 代码调用
1
| AppInitializer.getInstance(context).initializeComponent(ExampleLoggerInitializer::class.java)
|
App Startup 源码分析
Android 启动优化(七) - JetPack App Startup 使用及源码浅析 - 掘金
App Startup 小结
- App Startup,我觉得他的设计初衷应该是为了收拢 ContentProvider,实际上对启动优化的帮助不是很大。
- 如果你的项目都是同步初始化的话,并且使用到了多个 ContentProvider,App Startup 可能有一定的优化空间,毕竟统一到了一个 ContentProvider 中,同时支持了简单的顺序依赖。
- 实际项目中启动优化,大多数啊都会使用多线程异步加载,这时候 App StartUp 就显得很鸡肋了
Ref
[x] App Startup:[应用启动 | Android 开发者 | Android Developers](https://developer.android.com/topic/libraries/app-startup) |