App Startup是用于在app启动阶段对组件进行初始化的一个小框架,是AndroidX中的一个小工具。
我们完全可以不用App Startup,自己实现对组件进行的初始化,好像也不是很难的事情。
为什么AndroidX还要开发App Startup呢?
经过对android官方开发文档的深入分析,发现主要原因还是App Startup实现了对复杂的初始化操作的管理,
把多个初始化事件放入一个流水线执行,提高性能,降低我们自己写初始化代码的工作量。
理由:流水线,定义初始化顺序,共享同一个content provider, 简单直接,高效,速度快
- 在app启动时初始化组件(基本功能)
- 把要执行的初始化操作排成流水线(流水线)
- 显式设置初始化顺序
- 同一个content provider使用App startup之前:必须分别给要初始化的component定义content provider
使用方法一(启动初始化)
第1步:Gradle依赖
第2步:为要初始化的组件编写Initializer
1) 为每一个想要初始化的组件定义一个组件initializer。
2) 定义组件initializer的方法:创建一个class,实现 Initializer<T> 接口。
create() 方法:把所有的对组件的初始化操作放在这个方法中,返回一个实例T。
dependencies() 方法:返回这个initializer所依赖的其他的 Initializer<T> 对象。通过这个方法来控制初始化顺序。
3) App Startup内部使用一个自带的 InitializationProvider的content provider来发现和调用上面写的initializers。
App Startup 通过检查InitializationProvider manifest entry内部的 <meta-data>entry,寻找需要初始化的组件的initializers
App Startup调用已经找到的initializers的dependencies() ,从而进一步寻找其他initializer。
所以用法有2种:
- 为initializer写一个<meta-data> entry,放在InitializationProvidermanifest entry的内部。
- 把这个initializer放在另一个可被发现的initializer的dependencies()的返回值中。
这个tools:node="merge" 属性保证了manifest合并工具能够正确处理冲突的entries.
可以通过运行 ./gradlew :app:lintDebug 来执行一次lint检查。
使用方法二(延迟初始化)
InitializationProvider使用了AppInitializer的entity,从而发现和运行initializer。
我们也可以直接使用AppInitializer,去初始化其他components,且这些components不需要在startup阶段访问。
1. 关闭某个组件的自动初始化
删除这个组件对应的initializer的 <meta-data> entry
为什么不直接删掉<meta-data>,而是用了一个tools:node="remove"?
使用 tools:node="remove" 而不是直接删除这个entry,从而确保manifest合并工具删除其他被合并进来的manifest文件带进来的这个entry。
2. 关闭所有组件的自动初始化
从AndroidManifest.xml文件删除InitializationProvider的整个entry。也可以通过tools:node="remove"实现删除(这种方法更好)
3. 使用 AppInitializer 来手动初始化组件和这个组件所依赖的组件。
个人理解与总结
app启动阶段常用操作:隐私协议、申请权限、广告、弹窗、环境监测、后台配置、截止日期、数据统计、首屏内容数据
app startup使用要点:1.Gradle依赖 2.创建initializer 3.配置InitializationProvider 4.手动调用AppInitizlier
希望这篇文章能对您有帮助!如果您对互联网、前/后/客户端、架构/分布式/高可用/高并发/高实时、电商、Redis、MySQL、Zookeeper、Spring、Android、浏览器插件、Java、C/C++、Linux、个性化推荐、社区发现、机器学习、数据挖掘等感兴趣,欢迎关注。