• 初始化Library新姿势——App Startup


    前言

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

    class MyApplication : Application() {
        override fun onCreate() {
            super.onCreate()
    
            ALibrary.initData(this)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    object ALibrary {
    
        fun initData(context: Context){
            println("初始化 ALibrary 成功")
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    初步使用

    首先我们需要添加依赖:

    implementation "androidx.startup:startup-runtime:1.1.1"
    
    • 1

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

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

    class ALibraryInitializer : Initializer {
        override fun create(context: Context): ALibrary {
            ALibrary.initData(context)
            return ALibrary
        }
    
        override fun dependencies(): List>> {
            return emptyList()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • create:在里面进行库的初始化,并且返回库的实体类。
    • dependencies:ALibrary 的初始化可能依赖于其它库,例如 BLibrary,那么就需要在 dependencies 中返回含 BLibrary 列表,具体后续再详细举例说明,现在先填 emptyList(),也就是没有依赖其它库。

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

            
                
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    I/System.out: 初始化 ALibrary 成功
    
    • 1

    初始化依赖

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

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

    object BLibrary {
    
        fun initData(context: Context){
            println("初始化 BLibrary 成功")
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    class BLibraryInitializer : Initializer {
        override fun create(context: Context): BLibrary {
            BLibrary.initData(context)
            return BLibrary
        }
    
        override fun dependencies(): List>> {
            return emptyList()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后修改下 ALibraryInitializer:

    class ALibraryInitializer : Initializer {
        override fun create(context: Context): ALibrary {
            ALibrary.initData(context)
            return ALibrary
        }
    
        override fun dependencies(): List>> {
            return listOf(BLibraryInitializer::class.java)  // <- 修改了这里
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后运行:

    I/System.out: 初始化 BLibrary 成功
    I/System.out: 初始化 ALibrary 成功
    
    • 1
    • 2

    需要注意的是:

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

    移除初始化

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

    	
    		
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

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

    AppInitializer.getInstance(context).initializeComponent(ALibraryInitializer::class.java)
    
    • 1
  • 相关阅读:
    【STM32】常用存储器
    LabVIEW应用开发——控件的使用(二)
    【Unity3D】魔方
    JVM - 双亲委派
    简单聊一聊公平锁和非公平锁,parallel并行流
    什么是无人机全自动飞行系统?概念、构成、作用深度解析
    【GIT版本控制】--什么是版本控制
    Django文件配置、request对象、连接MySQL、ORM
    盛会落幕,精彩延续 | 云扩科技入选《2022中国AI商业落地市场研究报告》
    【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)
  • 原文地址:https://blog.csdn.net/m0_46278918/article/details/125396441