初始化Library新姿势——App Startup

前言

在日常开发中,我们经常会在 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值