按照Google官方给出的定义:App Startup这个库在App启动的时候提供了一个直接、高效的方式来初始化组件。所有的library开发者和app开发者能够使用App Startup这个组件来简化启动顺序并且显示地设置初始化顺序。通过App Startup这个组件,您无需为需要初始化的每个组件定义单独的content providers
,而是允许通过共享一个content provider
来定义组件初始化器,从而提高应用的启动速度;
看完上面的话,我们知道,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"
属性是为了确保清单合并工具可能造成的冲突问题
App Startup库包含了一系列的lint规则,通过这些规则,你能够检查是否正确定义了组件初始化器。你可以在终端通过./gradlew :app:lintDebug
命令执行lint检查。
实现手动初始化
通常来说,当你使用App Startup时,InitializationProvider
对象就会使用AppInitializer
在App启动时来自动寻找并且运行初始化器。然而,你也可以直接调用。AppInitializer
来手动初始化不需要在启动时就调用的组件初始化器。这个操作被称作懒初始化,它能够减少程序启动的时间。要想实现手动初始化,必须先禁止掉你想要手动初始化的组件的自动初始化功能。 为了禁止掉单个组件的自动初始化功能,可以在清单文件中移除那个组件的<meta-data>
标签,举例来说,我们想禁止ExampleLogger
的自动初始化:
使用tools:node="remove"
而不是直接移除这个标签是为了确保清单合并工具能够移除所有合并文件的这个标签。
提示: 禁用组件的自动初始化也会禁用该组件的依赖项的自动初始化,比如我禁用了
ExampleLogger
,而ExampleLogger
依赖了WorkManager
,那么WorkManager
也不会自动初始化了。
我们现在知道如何禁止单个组件的自动初始化,那么如何禁止全部组件的自动初始化,转而手动初始化呢?Android官方给我们提供了这个写法:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
架构师筑基包括哪些内容
我花了将近半个月时间将:深入 Java 泛型.、注解深入浅出、并发编程.、数据传输与序列化、Java 虚拟机原理、反射与类加载、高效 IO、Kotlin项目实战等等Android架构师筑基必备技能整合成了一套系统知识笔记PDF,相信看完这份文档,你将会对这些Android架构师筑基必备技能有着更深入、更系统的理解。
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容
注:资料与上面思维导图一起看会更容易学习哦!每个点每个细节分支,都有对应的目录内容与知识点!
这份资料就包含了所有Android初级架构师所需的所有知识!
注:资料与上面思维导图一起看会更容易学习哦!每个点每个细节分支,都有对应的目录内容与知识点!
[外链图片转存中…(img-psYF8Mu3-1711900643208)]
[外链图片转存中…(img-RUMByovY-1711900643208)]
这份资料就包含了所有Android初级架构师所需的所有知识!