SDK无侵入初始化并获取Application
1.SDK无侵入初始化并获取Application
无侵入初始化SDK并获取Application
的意思是不需要业务方手动调用SDK的初始化函数。
这个就得利用Android四大基本组件之一ContentProvider
了,其执行的时机是位于Application
的attchBaseContext()
之后,Application
的onCreate()
之前,无需程序手动调用。
所以我们就可以自定义个ContentProvider
完成SDK的自动初始化并获取应用的Application。
class CPDemo : ContentProvider() {
override fun attachInfo(context: Context?, info: ProviderInfo?) {
super.attachInfo(context, info)
//编写SDK初始化逻辑,并获取Application
val application = context?.applicationContext
}
override fun onCreate(): Boolean = true
}
直接重写ContentProvider
并在attachInfo
执行SDK的初始化逻辑即可。
比较出名的内存泄漏检测库 LeakCanary
、Google官方的ProcessLifecycleOwner
就使用这个原理。
不过如果每个第三方库都借用ContentProvider
来完成无侵入式的初始化,势必造成自定义的ContentProvider
过多,直接增加了启动耗时:
为了避免ContentProvider
过多的问题,Google官方提供了App Startup
库,这个库主要是给SDK提供方实现无侵入初始化使用的:
implementation("androidx.startup:startup-runtime:1.1.1")
该官方库会将所有用于初始化的ContentProvider合并成一个,减少启动的耗时
基本使用如下:
class CPDemo2 : Initializer<Unit> {
override fun create(context: Context) {
//执行初始化逻辑
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
}
然后再AndroidManifest
中注册:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.example.gitlinux.CPDemo2"
android:value="androidx.startup" />
</provider>
更多用法可以参考郭神的文章:Jetpack新成员,App Startup一篇就懂
2.kotlin函数省略返回值类型真的好吗?
经常使用kotlin的程序都知道,kotlin的函数再某些场景下是可以不用显示声明返回值类型,这是为了提高开发效率,比如:
fun test() = ""
对于简单的函数来说,虽然省略了方法的返回类型,但是我们还是能够直接看出这个方法的返回值类型为String
,但是方法中调用了其他方法呢,比如:
fun test() = request()
//随便一个函数,这个函数体中还会调用其他的函数
fun request() = otherFun()
fun otherFun() = "hahaha"
这种情况下,如果我们要知道test()
方法的返回值类型必须先通过request()
函数再跳转到otherFun
才能知道test()
方法的返回值类型,这对于程序而言反而降低了开发效率。
所以我认为使用kotlin函数省略返回值类型的场景应该有一个前提:该函数的返回值类型程序能够很容易推断出来(尽量不依赖其他函数)
作者:长安皈故里
链接:https://juejin.cn/post/7085122222058111012
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。