初始化Library新姿势——App Startup

·  阅读 131

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

前言

在日常开发中,我们经常会在 Application 的 onCreate 进行库的初始化,就像这样:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        ALibrary.initData(this)
    }
}
复制代码

至于 ALibrary,我只是简单写个模拟类而已:

object ALibrary {

    fun initData(context: Context){
        println("初始化 ALibrary 成功")
    }
}
复制代码

在这篇文章中,我们尝试使用 App Startup 进行初始化。

初步使用

首先我们需要添加依赖:

implementation "androidx.startup:startup-runtime:1.1.1"
复制代码

具体的版本我们可以看看「App Startup 官方介绍」

然后创建 Initializer 的继承类,并实现其 create(context: Context)dependencies() 方法:

class ALibraryInitializer : Initializer<ALibrary> {
    override fun create(context: Context): ALibrary {
        ALibrary.initData(context)
        return ALibrary
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        return emptyList()
    }
}
复制代码
  • create:在里面进行库的初始化,并且返回库的实体类。
  • dependencies:ALibrary 的初始化可能依赖于其它库,例如 BLibrary,那么就需要在 dependencies 中返回含 BLibrary 列表,具体后续再详细举例说明,现在先填 emptyList(),也就是没有依赖其它库。

当然,直接这样创建 ALibraryInitializer 还是不够的,还需要一个桥梁来让 App Startup 知道,所以我们还需要在 AndroidManifest.xml 中进行配置:

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">
            <meta-data
                android:name="com.bjsdm.testkotlin.ALibraryInitializer"
                android:value="androidx.startup" />
        </provider>
复制代码

最主要的是更改 meta-data 的 name 的值,改为 ALibraryInitializer 的全路径。

运行,就能看到输出结果了:

I/System.out: 初始化 ALibrary 成功
复制代码

初始化依赖

下面我们来讲解下 dependencies 的使用。

首先,我们先准备 BLibrary 和 BLibraryInitializer:

object BLibrary {

    fun initData(context: Context){
        println("初始化 BLibrary 成功")
    }
}
复制代码
class BLibraryInitializer : Initializer<BLibrary> {
    override fun create(context: Context): BLibrary {
        BLibrary.initData(context)
        return BLibrary
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        return emptyList()
    }
}
复制代码

然后修改下 ALibraryInitializer:

class ALibraryInitializer : Initializer<ALibrary> {
    override fun create(context: Context): ALibrary {
        ALibrary.initData(context)
        return ALibrary
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        return listOf(BLibraryInitializer::class.java)  // <- 修改了这里
    }
}
复制代码

然后运行:

I/System.out: 初始化 BLibrary 成功
I/System.out: 初始化 ALibrary 成功
复制代码

需要注意的是:

  • BLibrary 比 ALibrary 提前初始化
  • BLibraryInitializer 无需在 AndroidManifest.xml 中进行声明。

移除初始化

使用 App Startup 还有一个优势,就是假如引用的库使用了 App Startup 进行初始化,默认情况下是启动 App 后就自动初始化了,但是若我们不希望其初始化,可以在 AndroidManifest.xml 中进行配置:

	<provider
		android:name="androidx.startup.InitializationProvider"
		android:authorities="${applicationId}.androidx-startup"
		android:exported="false"
		tools:node="merge">
		<meta-data
			android:name="com.bjsdm.testkotlin.ALibraryInitializer"
			tools:node="remove" />
	</provider>
复制代码

核心还是在于要修改 meta-data 的 name 的值,其余的都不需要改动。

但是由于我们通过以上步骤移除了库的初始化,那么岂不是不能再次进行该库了初始化了吗?

当然也不是,我们可以通过手动的方式进行初始化:

AppInitializer.getInstance(context).initializeComponent(ALibraryInitializer::class.java)
复制代码
分类:
Android
收藏成功!
已添加到「」, 点击更改