【Android】浅谈androidx.startup.InitializationProvider

一,概述

InitializationProvider是Android官方提供的一种应用初始化方式。InitializationProvider通过provider机制,实现不同模块隔离初始化,避免多模块业务耦合到一个Application中初始化。并且提供了依赖项,对于依赖初始化管理更加便利。provider会在应用启动时install,早于Application#onCreate方法。相比于Application#onCreate,有如下优势:

二,原理

1,声明InitializationProvider

声明如上,系统在ActivityThread#handleBindApplication中,会install所有声明的provider,随后再回调Application#onCreate方法,如下

因此,Provider#onCreate比Application#onCreate早些许。本文不展开谈installContentProvider细节,只需知道上述流程决定了Provider作为应用初始化的基础。

2,声明Initializer

在xml声明Provider处,声明meta-data参数,即可声明Initializer。如下,可以写多个初始化组件,以解耦不同模块的初始化。

初始化组件需继承Initializer接口,实现create和dependencies方法,如下

create即初始化逻辑定义处,传入的context是应用Application。

dependencies定义其他依赖的初始化组件,也需实现Initalizer接口,依赖组件会优先初始化,形成一个依赖树。叶子节点最先初始化。

3,执行Initializer

初始化组件执行在InitializationProvider#onCreate中,如下

拿到applicationContext,通过AppInitializer初始化声明的Initializer组件,如下

通过ComponentName拿到InitializationProvider声明的meta-data数组,这里就拿到了所有的Initializer接口实现类声明。

以上逻辑就很清晰了,

1,拿到初始化value字段,这个字段由于过滤meta-data声明的数据,快速找到Initializer组件。

2,创建一个set存放Initializer的class容器

3,匹配androidx.startup

4,存放Initializer#Class

5,调用doInitialize实例化Initializer组件,

最后直接看doInitialize

1,如果组件已经初始化,直接在第5步返回,避免重复初始化。

2,找到依赖项,递归调用doInitialize方法

3,调用Initializer#create方法

4,添加至初始化记录容器

以上,即InitlizationProvider核心逻辑。

相关推荐
祖国的好青年11 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴11 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭11 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首12 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
zhangphil13 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
神探小白牙13 小时前
echarts,3d堆叠图
android·3d·echarts
李白的天不白13 小时前
如何项目发布到github上
android·vue.js
summerkissyou198713 小时前
Android-RTC、NTP 和 System Time(系统时间)
android
小书房13 小时前
Kotlin使用体验及理解1
android·开发语言·kotlin
撩得Android一次心动14 小时前
Android Navigation 组件全面讲解
android·jetpack·navigation