概述
在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,在启动优化时,可以不妨删除一些(前提在不影响项目正常编译的情况下)。
最后
以上就是迷你板凳为你收集整理的Android SDK初始化优化之ContentProvider的全部内容,希望文章能够帮你解决Android SDK初始化优化之ContentProvider所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复