prefacio
Me tomé el tiempo de aprender sobre el inicio de la aplicación del componente JetPack, así que escribí un ejemplo para compartir el uso del inicio de la aplicación.
Ejemplo de inicio
Ejemplo del uso de App StartUp del componente JetPack para implementar el inicio de la cadena SDK y el inicio diferido a través del código pseudo SDK.
Ejemplo de StatusUp : vea el código de ejemplo de inicio
Introducción al inicio de la aplicación
App Startup, un miembro de la familia Android Jetpack, proporciona una manera simple y eficiente de inicializar componentes cuando se inicia una aplicación. Tanto los desarrolladores de aplicaciones como los desarrolladores de bibliotecas pueden usar el inicio de aplicaciones para simplificar el proceso de inicio y establecer explícitamente la secuencia de inicialización.
App Startup no necesita definir un ContentProvider separado para la inicialización de cada componente, proporciona un ContentProvider para ejecutar la inicialización de todas las dependencias, lo que mejora significativamente la velocidad de inicio de la aplicación.
Dirección de inicio de la aplicación : ver el documento oficial en inglés
Uso básico del componente JetPack Statup
1. Uso básico
1. Agregue la dependencia de inicio de la aplicación en el archivo build.gradle de la aplicación.
implementation "androidx.startup:startup-runtime:1.1.1"
2. Crear una nueva clase, heredar de Initializer<T>
e implementar create()
ydependencies()
El genérico T usa el nombre del Sdk que necesita inicializarse, tomando SdkA como ejemplo, y create()
completa la inicialización de SdkA en el método:
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被初始化了
代码示例
Dirección de código de ejemplo completo: StartUp-Example
Descripción de la dependencia SDK del código de muestra:
SdkE inicio:
Haga clic en el botón Correo para inicializar el SdkE.
Para facilitar la visualización de la secuencia de inicio, SdkA a SdkE se retrasan cuando se crean, y todos están configurados en 500 milisegundos, de los cuales SdkB establece el retraso en 1000 milisegundos.
Cada Sdk en la consola inicializa el registro de impresión:
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被初始化了