StartUp是为了App的启动提供的一套简单、高效的初始化方案。

ContentProvider中初始化

在项目中会需要用到很多的第三方库,而很多第三方库都提供了显示的调用初始化接口,需要在Application中进行初始化,并获取到Application的Context。

于是乎,Application中的代码就可能会变成这个样子:

class MyApplication : Application() {override fun onCreate() {super.onCreate()A.initialize(this)B.initialize(this)C.initialize(this)...}...
}

随着引入的第三方库越来越多,Application中的代码也是越来越庞大。

于是乎,有些更加聪明的库设计者,他们想到了一种非常巧妙的办法来避免显示的调用初始化接口,而是可以自动调用初始化接口,这种办法就是借助ContentProvider。

ContentProvider作为Android四大组件之一,其主要作用是跨应用程序共享数据。

然而这些第三方库并没有打算使用ContentProvider来跨应用程序共享数据,只是准备使用它拿到Context进行初始化而已。在APP的启动流程中,有一步就是要执行到程序中所有注册过的ContentProvider的onCreate方法,所以这些第三方库的初始化就默默自动完成了。

这种设计方式可以将库的用法进一步简化,不需要主动去调用初始化接口,而是将这个工作在背后悄悄自动完成了,给集成库的开发者们带来了很大的便利。很多库都用到了这种方法,比如Facebook,Firebase。

但是呢,看上去如此巧妙的技术方案,有一个很大的缺点就是,ContentProvider会增加许多额外的耗时。因为不同的库就定义了不同的ContentProvider类,多了这么多ContentProvider,ContentProvider作为四大组件之一,启动也是耗时的,自然也就增加App启动消耗的时间了。

这时候就需要App Startup来对此情况进行优化了。

App Startup

首先来看一下官网对于Startup的简介:

The App Startup library provides a straightforward, performant way to initialize components at application startup. Both library developers and app developers can use App Startup to streamline startup sequences and explicitly set the order of initialization.
Instead of defining separate content providers for each component you need to initialize, App Startup allows you to define component initializers that share a single content provider. This can significantly improve app startup time.

主要说到了两点特性:

  • 明确设置初始化顺序
  • 共享单个ContentProvider

其实,App Startup内部也是创建了一个ContentProvider,并提供了一套用于初始化的标准。然后对于其他第三方库来说,就不需要再自己创建ContentProvider了,都按Startup这套标准进行实现就行了。同时Startup还提供了可以设置初始化顺序。

App Startup使用

首先,引入库:

implementation 'androidx.startup:startup-runtime:1.1.1'

然后定义一个用于执行初始化的Initializer,并实现App Startup库的Initializer接口:

class ARouterInitializer : Initializer<String> {override fun create(context: Context): String {ARouter.init(context.applicationContext as Application)return "ARouterInit"}override fun dependencies(): List<Class<out Initializer<*>>> {return emptyList()}
}

实现Initializer接口要求重写两个方法,在create()方法中可以进行初始化操作,这里以ARouter发初始化为例。
dependencies()方法表示,当前的初始化是否还依赖于其他的Initializer,如果有的话,就在这里进行配置,App Startup会保证先初始化依赖的Initializer,然后才会初始化当前,这样就可以设置初始化顺序了。当然,绝大多数的情况下,初始化操作都是不会依赖于其他Initializer的,所以通常直接返回一个emptyList()就可以了。

最后,在AndroidManifest.xml中进行配置,这里需要严格按照Startup的配置规范:

        <providerandroid:name="androidx.startup.InitializationProvider"android:authorities="${applicationId}.androidx-startup"android:exported="false"tools:node="merge"><meta-dataandroid:name="com.example.base.ARouterInitializer"android:value="androidx.startup" /></provider>

只有meta-data中的android:name部分需要指定成自定义的Initializer的全路径类名,其他部分都是不能修改的,否则App Startup库可能会无法正常工作。
tools:node="merge"标签就是用来合并所有申明了InitializationProvider的ContentProvider。

延迟初始化

如果不希望初始化在应用启动的时候自动初始化,App Startup也是提供了手动调用初始化的方法。

        <!-- 禁用所有InitializationProvider组件初始化 --><providerandroid:name="androidx.startup.InitializationProvider"android:authorities="${applicationId}.androidx-startup"tools:node="remove" /><!-- 禁用单个InitializationProvider组件初始化 --><providerandroid:name="androidx.startup.InitializationProvider"android:authorities="${applicationId}.androidx-startup"android:exported="false"tools:node="merge"><meta-dataandroid:name="com.example.base.ARouterInitializer"tools:node="remove" /></provider>

使用tools:node="remove"标签,这个标签用于告诉manifest merger tool,在最后打包成APK时,将所有该名称的节点全部删除。可以禁用所有InitializationProvider组件初始化,也可以禁用单个InitializationProvider组件初始化。

AppInitializer.getInstance(this).initializeComponent(ARouterInitializer::class.java)

然后再手动调用App Startup提供的初始化方法。

学习Android启动初始化 App StartUp相关推荐

  1. Android Jetpack组件App Startup简析

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  2. Android启动一个app 流程

    我们平时在手机桌面上点击一个app 图标, 就能启动一个app应用.从用户角度来看,这个过程看起来很简单,但是它的背后又隐藏着什么玄机 ? 在做安卓开发这么多年后,我觉得有必要认真的分析一下,启动一个 ...

  3. python脚本控制手机app_Python+Appium学习之启动手机APP或者浏览器

    一.启动浏览器: pycharm中python脚本如下: 1 from appium importwebdriver2 3 desired_caps ={4 'platformName':'Andro ...

  4. android 启动其他app的activity,Android在一个app中启动其他app中的service或者Activity

    前言: 启动另一个app的activity和service其实是一样的,区别在于startActivity(intent)还是startService(intent)而已:所以下面案例以启动另一个ap ...

  5. android启动其他app的服务器,Android中通过外部程序启动App的三种方法

    这篇文章主要介绍了Android中通过外部程序启动App的三种方法, 本文讲解了直接通过包名. 通过自定义的Action. 通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下 ==== ...

  6. Android 启动第三方app

    一:直接通过包名 ① Intent intent = getPackageManager().getLaunchIntentForPackage("com.test.mydemo" ...

  7. 深入探索Android 启动优化(七) - JetPack App Startup 使用及源码浅析

    本文首发我的微信公众号:徐公,想成为一名优秀的 Android 开发者,需要一份完备的 知识体系,在这里,让我们一起成长,变得更好~. 前言 前一阵子,写了几篇 Android 启动优化的文章,主要是 ...

  8. 【Android学习笔记】设置App启动页

    先将启动页放到项目资源中,图片一般是1080*1920的jpg. 新建一个activity,如图: 创建成功之后,打开刚刚创建的activity,来进行代码的编写: public class BZLa ...

  9. Android启动流程:上电到启动第一个APP的详细流程,

        1. 安卓启动大致如下图所示: 2. BootLoader (如果想了解跟详细关于bootloader请看:安卓bootloader) 从系统的角度上来讲,Android系统的启动过程可以分为 ...

最新文章

  1. Docker中的Java内存消耗优化以及我们如何使用Spring Boot
  2. Linux下通过PXE服务器安装Linux系统
  3. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)...
  4. 聚能聊每周精选 第二十三期
  5. 乘方取模计算(模幂计算)
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 20丨查询球队积分【难度中等】​
  7. MediaStreamAudioSourceNode
  8. 既然选择了远方,便只顾风雨兼程……
  9. PHP htmlspecialchars() 函数
  10. java rsa模块_【HAVENT原创】NodeJS 两个模块进行 RSA 加密解密(匹配Java RSA)
  11. PHP解密PHP加密sg11加密sg11解密全网最厚道的SG11解密方法sg11解密 php解密 SourceGuardian解密sg_load解密去除域名IP授权
  12. oracle 设置 锁模式,oracle表锁的几种模式v$locked_object-locked_mode
  13. 嵌入式工程师待遇北京地区最高
  14. 东芝硬盘数据丢失怎么恢复
  15. 关键路径例题图表_关键路径习题.ppt
  16. base64编码的使用与解析
  17. iOS 送审浅谈:1.4.1、2.1、2.5.2、2.5.4、4.2.3、5.2.5
  18. python源码只有编译成二进制_setup-cython(2):把Python打包成二进制应用吧
  19. 3D MAX石墨工具学习技巧
  20. 测速C语言,测速显示C程序

热门文章

  1. 输入法中表情和小图标的应用
  2. JSD2204-java基础复习
  3. MCE公司:你所不知道的 MCE--光反应赖氨酸的高难度合成
  4. 比迅雷好用,下载速度快5倍的下载软件IDM(Internet Download Manager)
  5. 蓝色实景旅游产品手册PPT模板
  6. WindowServer2012R2+Anoconda3.5.0.1+CUDA9.0+cuDNN7.1.3+Tensorflow-gpu1.6离线搭建深度学习开发环境
  7. 富爸爸系列全集图书清单
  8. 【0034】 PostgreSQL报错信息:The server must be started by the user that owns the data directory.
  9. 470计算机毕业设计
  10. 制动器作用停止 发那科机器人_FANUC机器人长期停机再运转时注意事项