Ejemplo de uso del componente JsetPack App StartUp

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懒加载

  1. 在普通使用的基础之上,首先将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>
  1. 在需要初始化的地方,手动调用代码初始化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初始化后初始化,则SdkBBInitializer代码可定义如下:

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:

Relación de inicio de dependencia SDK

SdkE inicio:

Haga clic en el botón Correo para inicializar el SdkE.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被初始化了

日志输出

Supongo que te gusta

Origin juejin.im/post/7120563278492729351
Recomendado
Clasificación