Android SDK初始化优化之ContentProvider

在Android开发中,随着业务需求的增加,总会引入一些第三方或内部自己开发一些SDK,使用时,总会要求我们在Application的onCreate方发中进行初始化,但随着项目的发展,会引入越多越多的SDK,导致Application逐渐庞大,今天尝试,使用谷歌官方博客中的一种做法,优化SDK的初始化

1,创建一个Provider类,如下:

import android.util.Log

class StudyProvider:ContentProvider() {
    private var TAG = StudyProvider::class.simpleName

    override fun onCreate(): Boolean {
        Log.d(TAG,"onCreate SDK init()")
        //这里的context是kotlin的语法,在java中可以直接调用getContext()获取上下文
        init(context)
        return super.onCreate()
    }

    fun init(context:Context?){
        //这里做sdk的初始化
    }
}

 2,在AndroidManifest目录下添加注册

  <provider
            android:authorities="${applicationId}.StudyProvider"
            android:exported="false"
            android:grantUriPermissions="true"
            android:name=".StudyProvider">

            <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
  </provider>

 其中的file_paths为了适配高版本的存储而创建的。

在res目录下新建xml的目录,然后创建名为:file_paths的文件,内容如下 :

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path
    name="files"
    path="."/>
    <cache-path
        name="cache"
        path="."/>
    <external-path
        name="external"
        path="."/>
    <external-path
        name="external_files"
        path="."/>
    <external-files-path
        name="external_file_path"
        path="."/>
    <external-cache-path
        name="external_cache_path"
        path="."/>
</paths>

 对如上代码不做过多介绍,详细内容可以翻阅谷歌官方文档

3,创建Application,并在AndroidManifest中添加引用


class StudyApplication :Application() {
    private var TAG = StudyApplication::class.java.simpleName
    override fun onCreate() {
        super.onCreate()
        Log.d(TAG,"onCreate SDK init()")
    }

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        Log.d(TAG,"attachBaseContext SDK init()")
    }
}

创建完成后,启动App,会打印如下日志

2021-06-02 05:08:06.153 5819-5819 D/StudyApplication: attachBaseContext SDK init()
2021-06-02 05:08:06.203 5819-5819 D/StudyProvider: onCreate SDK init()
2021-06-02 05:08:06.244 5819-5819 D/StudyApplication: onCreate SDK init()

根据上述日志可知,在App启动时,会先执行Application的attachBaseContext方法,而后执行我们的FileProvider中onCreate方法,完成SDK的初始化。这样我们在封装一些SDK时,都可以这样实现,减少Application不必要的初始化,给第三方提供时,集成也更加方便,像著名的开源工具库AndroidUtilCode 其内部也是这样实现。

优点:这样做极大的 优化了Application,给第三方集成时,实现无侵入性集成。

缺点:根据很多博文描述,每一个ContentProvider的创建都将耗费2ms左右的时间,如果项目中有大量的ContentProvider,在启动优化时,可以不妨删除一些(前提在不影响项目正常编译的情况下)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值