欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新

Jetpack架构组件学习(4)——APP Startup库的使用,运行结果如下所示:关

来源: 开发者 投稿于  被查看 5415 次 评论:181

Jetpack架构组件学习(4)——APP Startup库的使用,运行结果如下所示:关


最近在研究APP的启动优化,也是发现了Jetpack中的App Startup库,可以进行SDK的初始化操作,于是便是学习了,特此记录

原文:Jetpack架构组件学习(4)——App Startup库的使用 - Stars-One的杂货小窝

两种方式初始化SDK

首先,先是讲解了关于SDK的初始化方式,像我们一般使用到百度地图,或者某些开源库的时候,需要我们进行初始化操作

而他们文档给出的大多数为以下方式:

自定义一个Application,在Application对应的生命周期OnCreate()方法中进行初始化操作

这样一样,一旦项目接入的SDK过多,Application里的初始化逻辑也是多了起来,且代码层面,每次都要去加代码,也是十分繁琐.

针对代码繁琐的问题,有的开源库作者找到了一种比较取巧的方法,那就是通过四大组件中的ContentProvider进行初始化操作

具体怎么做呢?

首先,创建一个ContentProvider类:

package site.starsone.abdemo

import android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import com.blankj.utilcode.util.LogUtils

class MyContentProvider: ContentProvider() {
    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        TODO("Not yet implemented")
    }

    override fun query(
        uri: Uri,
        projection: Array<out String>?,
        selection: String?,
        selectionArgs: Array<out String>?,
        sortOrder: String?
    ): Cursor? {
        TODO("Not yet implemented")
    }

    override fun onCreate(): Boolean {
       context?.let {
           LogUtils.d("初始化了...")
       }
        return true
    }

    override fun update(
        uri: Uri,
        values: ContentValues?,
        selection: String?,
        selectionArgs: Array<out String>?
    ): Int {
        TODO("Not yet implemented")
    }

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
        TODO("Not yet implemented")
    }

    override fun getType(uri: Uri): String? {
        TODO("Not yet implemented")
    }

}

PS:上面,因为我们只是为了初始化,所以只给了onCreate()其他的方法直接留空不写即可

之后,还需要在AndroidManifest.xml文件中进行声明

<application ...>

    <provider
        android:name=".MyContentProvider"
        android:authorities="${applicationId}.myProvider"
        android:exported="false" />

</application>

authorities在这里并没有固定的要求,填写什么值都是可以的,但必须保证这个值在整个手机上是唯一的,

所以通常会使用${applicationId}作为前缀,以防止和其他应用程序冲突。

运行结果如下所示:

关于运行的流程,如下图所示

一个应用程序的执行顺序是这个样子的。首先调用ApplicationattachBaseContext()方法,

然后调用ContentProvideronCreate()方法,接下来调用Application的onCreate()方法。

我们使用上述方法治好,在提供库给别的开发者用的时候,别的开发者就不用再去多写一步初始化的操作了,简化了其他开发者使用库的操作流程。

上面的方法虽然是比较巧妙,但是ContentProvider会增加许多额外的耗时

一个空白的ContentProvider会多出2ms的加载时间,实际项目复杂多一多,加载速度岂不是直接拖慢?

这有什么解决方法呢?

当然有,官方也是发现了开发者通过ContentProvider来取巧进行初始化的步骤,于是进行了进一步的封装,于是就是今天所讲的App Startup:

它可以将所有用于初始化的ContentProvider合并成一个,从而使App的启动速度变得更快。

话说是不是官方已经变相承认了这种取巧方式哈哈

用户评论