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的配置规范:

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">
            <meta-data
                android: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组件初始化 -->
        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            tools:node="remove" />
        <!-- 禁用单个InitializationProvider组件初始化 -->
        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">
            <meta-data
                android: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的应用详解的文章就介绍到这了,更多相关Android App StartUp内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Android启动初始化方案App StartUp的应用详解的更多相关文章

  1. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. html5唤起app的方法

    这篇文章主要介绍了html5唤起app的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  7. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  8. xcode – 上传到App Store时进行身份验证

    只需为现有安装/文件夹创建备份,这很重要,因为在(新)安装期间,Transporter将删除以前的安装:现在运行以下命令来更新Transporter:希望这有助于某人.

  9. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  10. App store拒绝应用程序在iOs 10上支持IPV6网络

    我收到苹果公司的app拒绝邮件,下面是我们在连接到IPv6网络的Wi-Fi上运行iOS10.0.2的iPad和iPhone上查看了应用中的一个或多个错误.具体来说,应用程序在启动时仍保留在启动屏根据他们的要求,我已经在我的Mac上创建了NAT64网络,并为iPhone5S设备10.0.2os版本共享了互联网,App工作正常,但苹果称其不与IPv6合作任何人都可以确认我需要检查其他什么吗?

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部