codeccc / StartUp-Example

JetPack组件StartUp使用示例,通过伪Sdk代码实现Sdk链式启动和懒启动。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

StartUp-Example

JetPack组件App StartUp使用示例,通过伪Sdk代码实现Sdk链式启动和懒启动。

App StartUp 简介

App Startup 是 Android Jetpack 家族的成员,提供了一种在应用程序启动时,简单、高效的初始化组件的方法。无论是App开发人员,还是Library开发人员都可以使用App Startup来简化启动过程,并显式地设置初始化顺序。 App Startup 不需要为每个组件的初始化定义单独的 ContentProvider,它提供了一个 ContentProvider 来运行所有依赖项的初始化,从而显著的提高了应用程序的启动速度。

App StartUp的地址:查看官方英文文档

StatuUp Example示例:查看StartUp-Example

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

  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被初始化了

代码示例

完整example代码地址: StartUp-Example

示例代码的Sdk依赖说明:

Sdk依赖启动关系

SdkE启动图示:

SdkE启动图示

控制台中各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被初始化了

日志

About

JetPack组件StartUp使用示例,通过伪Sdk代码实现Sdk链式启动和懒启动。

License:Apache License 2.0


Languages

Language:Kotlin 100.0%