使用 Android Jetpack 中的 Startup 组件快速实现组件初始化逻辑与主模块解耦

当我们在写 Android 应用的时候,经常会遇到需要在 Android 应用启动的时候,需要初始化一些组件,所以我们经常会在 ApplicationonCreate 方法中编写初始化组件的逻辑,例如:

kotlin 复制代码
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        initModuleA()
        initModuleB()
        initModuleC()
        initModuleD()
        ...
    }    
}

很显然,使用以上方法与 Application 具有强耦合的关系,当新增需要初始化的业务的时候,或者部分模块的业务需要变动的时候,此时又需要调整 Application 类,稍微缺少了灵活性,当组件或者模块很多的时候,也不利于业务自身的拓展。

因此,Android Jetpack 中推出了 Startup 组件,其旨在实现在应用启动时初始化组件的简单而高效的方法。其通过继承 androidx.startup.Initializer<T> 接口,并在 manifest 中定义 androidx.startup.InitializationProviderprovider,并指定 meta-data,即可实现在应用初始化的时候自动调用 create,实现自动化组件,例如:

在 gradle 中导入依赖

groovy 复制代码
dependencies {
    implementation "androidx.startup:startup-runtime:1.2.0"
}

编写初始化模块的逻辑

kotlin 复制代码
package com.example

class MyInitializer: Initializer<Void> {
    override fun create(context: Context): Void {
        initMuduleA()
    }

    override fun dependencies(): List<Class<out Initializer<*>?>?> {
        return emptyList()
    }
}

声明 androidx.startup.InitializationProviderprovider

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application>

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">
            
            <!-- 这里指定自己的 Initializer 的全限定名 -->
            <meta-data  android:name="com.example.MyInitializer"
                android:value="androidx.startup" />

            <!-- 可以定义多个 Initializer -->
            <meta-data  android:name="com.example.MyInitializer2"
                android:value="androidx.startup" />
        </provider>
        
    </application>

</manifest>

如果在多个模块需要使用,只需要在多个模块里面都定义 androidx.startup.InitializationProviderprovider 即可,需要严格按以上模式进行定义。

这样子,我们就将组件初始化的逻辑与主逻辑区别开来了,当应用启动的时候,会自动寻找所有的 Initializer,并调用其 create() 方法。如果组件初始化有先后关系,则只需要使用 dependencies() 中返回的 List 指定此模块初始化依赖的 Initializer 即可。

具体用法可以参考官方文档:https://developer.android.com/topic/libraries/app-startup

相关推荐
科技块儿3 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc3 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20354 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106324 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
vistaup4 小时前
OKHTTP 默认构建包含 android 4.4 的TLS 1.2 以及设备时间不对兼容
android·okhttp
常利兵4 小时前
ButterKnife在Android 35 + Gradle 8.+环境下的适配困境与现代化迁移指南
android
撩得Android一次心动4 小时前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
熊猫钓鱼>_>4 小时前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
Think_Higher4 小时前
广告投放术语一文解读 CPM CPC CPA OCPC OCPM OCPA
经验分享
AI职业加油站5 小时前
职业提升之路:我的大数据分析师学习与备考分享
大数据·人工智能·经验分享·学习·职场和发展·数据分析