前言
抽空学了一下JetPack组件App StartUp,于是写了一个Example分享一下App StartUp的使用方法。
StartUp-Example
JetPack组件App StartUp使用示例,通过伪Sdk代码实现Sdk链式启动和懒启动。
StatuUp Example示例:查看StartUp-Example代码
App StartUp 简介
App Startup 是 Android Jetpack 家族的成员,提供了一种在应用程序启动时,简单、高效的初始化组件的方法。无论是App开发人员,还是Library开发人员都可以使用App Startup来简化启动过程,并显式地设置初始化顺序。
App Startup 不需要为每个组件的初始化定义单独的 ContentProvider,它提供了一个 ContentProvider 来运行所有依赖项的初始化,从而显著的提高了应用程序的启动速度。
App StartUp的地址:查看官方英文文档
JetPack组件Statup的基本使用方法
一、基本使用
1. 在app的build.gradle中添加App StartUp依赖
implementation "androidx.startup:startup-runtime:1.1.1"
2. 新建类,继承自 Initializer<T> ,并实现create()和dependencies()
T泛型使用需要初始化的Sdk的名称,以SdkA为例,并在create()方法中完成对SdkA的初始化:
class AInitializer : Initializer<SdkA> {
override fun create(context: Context): SdkA {
return SdkA.create(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
由于SdkA是独立Sdk,不与其他依赖产生关联,所以 dependencies()方法返回空列表。
3. 在AndroidManifest.xml中注册StartUp的Provider组件
除了meta-data的name需要指向自己实现的AInitializer类以外,其余需按如下格式来写:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.startup_example.task.AInitializer"
android:value="androidx.startup" />
</provider>
android:value="androidx.startup"中的value值固定为androidx.startup。
至此,便已实现通过StartUp初始化第三方Sdk的功能,当app运行时会自动初始化三方SDK。
二、进阶使用
1、延迟初始化SDK,实现SDK懒加载
- 在普通使用的基础之上,首先将AndroidManifest.xml中注册的
Initializer所在的meta-data标签中添加tools:node="remove"
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.startup_example.task.EInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
- 在需要初始化的地方,手动调用代码初始化Sdk
//延迟初始化Sdk
AppInitializer.getInstance(applicationContext)
.initializeComponent(EInitializer::class.java)
完整代码如下:
binding.fab.setOnClickListener { view ->
//延迟初始化Sdk
AppInitializer.getInstance(applicationContext)
.initializeComponent(EInitializer::class.java)
Snackbar.make(view, "初始化SdkE", Snackbar.LENGTH_LONG)
.setAnchorView(R.id.fab)
.setAction("Action", null).show()
}
2、实现Sdk链式启动
链式启动,即Sdk启动存在先后顺序或相互关联,比如需要先启动SdkA后再启动SdkB。
假设SdkB需要在SdkA初始化后初始化,则SdkB的BInitializer代码可定义如下:
class BInitializer : Initializer<SdkB> {
override fun create(context: Context): SdkB {
//加入延时方便查看启动先后顺序
Thread.sleep(1000)
return SdkB.create(context)
}
override fun dependencies(): List<Class<out Initializer<*>>> {
return listOf(AInitializer::class.java)
}
}
在AndroidManifest.xml注册BInitializer:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.startup_example.task.AInitializer"
android:value="androidx.startup" />
<!--注册SdkB的启动类-->
<meta-data
android:name="com.example.startup_example.task.BInitializer"
android:value="androidx.startup" />
</provider>
此时便完成了Sdk的链式启动,对Sdk初始化进行打印,app运行后的打印日志如下:
2022-07-15 18:18:17.890 3915-3915/com.example.startup_example D/StartUp: SdkA被初始化了
2022-07-15 18:18:18.891 3915-3915/com.example.startup_example D/StartUp: SdkB被初始化了
代码示例
完整example代码地址: StartUp-Example
示例代码的Sdk依赖说明:
SdkE启动:
点击点击 邮件 按钮初始化SdkE。
为了方便查看启动顺序,SdkA到SdkE均在创建时做了延时,均设置为500毫秒,其中SdkB设置延时为1000毫秒。
控制台中各Sdk初始化打印日志:
2022-07-15 18:18:17.890 3915-3915/com.example.startup_example D/StartUp: SdkA被初始化了
2022-07-15 18:18:18.891 3915-3915/com.example.startup_example D/StartUp: SdkB被初始化了
2022-07-15 18:18:19.394 3915-3915/com.example.startup_example D/StartUp: SdkC被初始化了
2022-07-15 18:18:19.898 3915-3915/com.example.startup_example D/StartUp: SdkD被初始化了
2022-07-15 18:19:40.135 3915-3915/com.example.startup_example D/StartUp: SdkE被初始化了