最近在研究APP的啟動優化,也是發現了Jetpack中的App Startup庫,可以進行SDK的初始化操作,於是便是學習了,特此記錄 原文:Jetpack架構組件學習(4)——App Startup庫的使用 - Stars-One的雜貨小窩 兩種方式初始化SDK 首先,先是講解了關於SDK的初始化 ...
最近在研究APP的啟動優化,也是發現了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}作為首碼,以防止和其他應用程式衝突。
運行結果如下所示:
關於運行的流程,如下圖所示
一個應用程式的執行順序是這個樣子的。首先調用
Application
的attachBaseContext()
方法,然後調用
ContentProvider
的onCreate()
方法,接下來調用Application的onCreate()
方法。
我們使用上述方法治好,在提供庫給別的開發者用的時候,別的開發者就不用再去多寫一步初始化的操作了,簡化了其他開發者使用庫的操作流程。
上面的方法雖然是比較巧妙,但是ContentProvider
會增加許多額外的耗時
一個空白的ContentProvider
會多出2ms的載入時間,實際項目複雜多一多,載入速度豈不是直接拖慢?
這有什麼解決方法呢?
當然有,官方也是發現了開發者通過ContentProvider
來取巧進行初始化的步驟,於是進行了進一步的封裝,於是就是今天所講的App Startup
:
它可以將所有用於初始化的ContentProvider合併成一個,從而使App的啟動速度變得更快。
話說是不是官方已經變相承認了這種取巧方式哈哈