看完上面的话,我们知道,App Startup提供了一个ContentProvider
来完成项目需要的一些组件的初始化,避免每个第三方的库(比如友盟统计、埋点等)单独通过ContentProvider
进行初始化。
我的理解是通过App Startup这个组件,我们可以将所有第三方需要在Application
中初始化的一些库都通过ContentProvider
来初始化,有点偏向于将第三方库初始化这个过程进行了封装,大概是这个意思。
如何使用App Startup?
我们可以通过定义组件初始化器完成组件的初始化,那么如何定义组件初始化器呢?Android官方为我们提供了Initializer<T>
接口,通过实现接口并实现接口中的两个方法就可以实现组件初始化器的定义了。
我们来看下这两个方法:
-
create()
: 包含了初始化组件,并且返回T的实例的所有必要操作; -
dependencies()
: 此方法返回一个初始化程序依赖的其他Initializer对象的列表。可以使用此方法来控制应用程序启动时初始化的顺序。
在没有使用App Startup的时候,如何保证
content providers
的初始化顺序呢?其实很简单,在配置清单中将先启动的content provider
的<meta-data>
标签放在前面即可。
下面我们来看下如何进行初始化。
通过App Startup来运行依赖项的初始化有两种方式:
-
自动初始化(
automatic initialization
) -
手动初始化(
manually initialization
)
无论是自动初始化还是手动初始化都需要在app或者library中的build.gradle
文件中添加如下依赖:
实现自动初始化(拿官方例子来看)
假设你的应用程序依赖了WorkManager
,并且需要在程序一开始启动时就初始化WorkManager
,定义一个WorkManagerInitializer
类并且实现Initializer<WorkManager>
接口:
如图中所示,dependencies()
方法返回了一个空列表,意思是我WorkManager
实例化谁也不需要依赖,我自己个就能行。 假设我们的应用依赖了另一个叫做ExampleLogger
的库,这个库依赖于WorkManager
。这也就意味着,初始化这个库必须先确保WorkManager
的实例已经被初始化了才可以。那么如何做呢?我们看下官方代码:
代码中定义了一个ExampleLoggerInitializer
类并且实现了Initializer<ExampleLogger>
接口。这个时候我们看到dependencies()
方法返回的就不是空列表了,而是包含了WorkManagerInitializer
的一个列表,这样ExampleLogger
要想初始化,必须先初始化WorkManager
。
提示:如果App中之前使用
content providers
来初始化应用程序中的组件,请确保是使用App Startup时删除这些content providers
App Startup包含了一个名为InitializationProvider
的特殊的content provider
,它用来找到并且调用你的组件初始化器。那么这个过程是什么样的呢?
-
首先,通过检查
InitializationProvider
清单标签下的<meta-data>
标签,找到组件初始化器; -
App Startup调用它找到的所有组件初始化器的
dependencies()
方法。
这就意味着如果想要让App Startup找到组件初始化器,必须满足下面的一个条件:
-
组件初始化器在
InitializationProvider
清单标签下配置了相应的<meta-data>
标签; -
组件初始化器在一个已被找到的组件初始化器的
dependencies()
方法中被列出;
从我们上面写过的WorkManagerInitializer
和ExampleLoggerInitializer
这两个例子中来说,为了确保初始化器能被实现,需要在清单文件中配置如下代码:
如图中所示,我们只配置了ExampleLoggerInitializer
的<meta-data>
标签,因为它是依赖于WorkManager
的,并且满足了第二条:dependencies()
方法中列出了它依赖于WorkManager
,如果ExampleLoggerInitializer
能被炸到,那么WorkManagerInitializer
一定也能被找到。
tools:node="merge"
属性是为了确保清单合并工具可能造成的冲突问题
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
总结
最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
img-0ZSIC6sn-1711537719789)]
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。