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

相关推荐
e***87701 天前
windows配置永久路由
android·前端·后端
fouryears_234171 天前
现代 Android 后台应用读取剪贴板最佳实践
android·前端·flutter·dart
YF02111 天前
Frida for MacBook/Android 安装配置
android·前端
雨白1 天前
Android实战:构建高可维护的日志系统
android
茄子凉心1 天前
android 开机启动App
android·java·开发语言
2501_937193141 天前
神马影视 8.8 版源码:4K 播放优化体验测评
android·源码·源代码管理·机顶盒
修炼者1 天前
Kotlin中的Flow流
android·kotlin
洞见不一样的自己1 天前
Android studio 编译问题
android
j***63081 天前
SpringbootActuator未授权访问漏洞
android·前端·后端
YJlio1 天前
进程和诊断工具学习笔记(8.29):ListDLLs——一眼看清进程里加载了哪些 DLL,谁在偷偷注入
android·笔记·学习