Jetpack中的App Startup
库,可以进行SDK的初始化操作,下面来看看具体操作是什么。
两种方式初始化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}作为前缀,以防止和其他应用程序冲突。
运行结果如下所示:
我们使用上述方法治好,在提供库给别的开发者用的时候,别的开发者就不用再去多写一步初始化的操作了,简化了其他开发者使用库的操作流程。
上面的方法虽然是比较巧妙,但是ContentProvider
会增加许多额外的耗时
一个空白的ContentProvider
会多出2ms的加载时间,实际项目复杂多一多,加载速度岂不是直接拖慢?
这有什么解决方法呢?
当然有,官方也是发现了开发者通过ContentProvider
来取巧进行初始化的步骤,于是进行了进一步的封装,于是就是今天所讲的App Startup
:
它可以将所有用于初始化的ContentProvider合并成一个,从而使App的启动速度变得更快。
代码中进行初始化
至于初始化,则是在代码中进行即可,具体的时机由开发者来定,比如说在点击某个按钮之后
只需要传对应初始化的类即可,代码如下:
AppInitializer.getInstance(this).initializeComponent(SdkBInitializer::class.java)
上述代码是在Activity中进行的,所以使用的this
最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。
小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击扫描下方二维码免费领取~