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

相关推荐
小糖学代码24 分钟前
MySQL:14.mysql connect
android·数据库·mysql·adb
怪兽20142 小时前
请谈谈什么是同步屏障?
android·面试
帅锅锅0073 小时前
SeLinux 全面详解
android·linux
只想搞钱的肥仔3 小时前
Android thermal (5)_cooling device(下)
android
某空m3 小时前
【Android】BottomNavigationView实现底部导航栏
android·java
撩得Android一次心动5 小时前
Android 四大组件桥梁 —— Intent (意图) 详解
android
用户2018792831675 小时前
MVP架构模式:餐厅点餐的有趣故事
android
用户2018792831676 小时前
MVVM 架构模式:咖啡馆的智能点餐系统
android
用户2018792831676 小时前
浅析Android MVC架构
android
AsiaLYF7 小时前
kotlin中MutableStateFlow和MutableSharedFlow的区别是什么?
android·开发语言·kotlin