【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核心逻辑。

相关推荐
Jomurphys13 小时前
Kotlin - 类型别名 typealias
android·kotlin
Haha_bj13 小时前
Flutter ——flutter_screenutil 屏幕适配
android·ios
Haha_bj13 小时前
Flutter ——device_info_plus详解
android·flutter·ios
前端小伙计13 小时前
Android/Flutter 项目统一构建配置最佳实践
android·flutter
Mr_sun.15 小时前
Day09——入退管理-入住-2
android·java·开发语言
ujainu16 小时前
告别杂乱!Flutter + OpenHarmony 鸿蒙记事本的标签与分类管理(三)
android·flutter·openharmony
常利兵17 小时前
Android内存泄漏:成因剖析与高效排查实战指南
android
·云扬·17 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师17 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
doupoa18 小时前
内存指针是什么?为什么指针还要有偏移量?
android·c++