Jetpack App Startup学习笔记

好文章
这个笔记主要是对这篇文章的理解总结.
PokemonGo
笔记代码用的是这个开源项目, 这个作者人很热情.

总结
  1. 某个库使用了ContentProvider来进行初始化,那这个库最好接入App Startup,这样可以让使用了这个库的APP降低启动耗时.一般做APP开发很少能用到App Startup,如果考虑到架构可以将原来Application中初始化的代码移动到App Startup中单独执行,这样可以让代码结构更好.
  2. 一些库设计者会使用ContentProvider来初始化库, 这样做就不用使用的时候去显示的调用初始化库方法了.
  3. 假如每个库都使用ContentProvider来初始化, ContentProvider是四大组件之一,用多了会非常耗时,这个时候可以使用App Startup来解决这个问题,这些库使用App Startup提供的初始化标准后,App Startup可以将所有用于初始化的ContentProvider合并成一个,从而使APP启动速度变得更快.

使用

  1. 添加依赖
dependencies {
    
    
    implementation "androidx.startup:startup-runtime:1.0.0-alpha01"
}
  1. 初始化库代码
class AppInitializer : Initializer<Unit> {
    
    
    override fun create(context: Context) {
    
    
        // 这里类似于Application.create()方法,可以在此处初始化库
        Timber.plant(DebugTree())
        AppHelper.init(context)
    }
    // 如果当前AppInitializer还依赖于其他的XXInitializer类,
    // 那么就将该类加入集合中类似:mutableListOf(OtherInitializer::class.java),如果没有依赖就返回空
    override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
}
  1. 配置AndroidManifest.xml文件
<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data
        android:name="com.hi.dhl.pokemon.init.AppInitializer"
        android:value="androidx.startup" />
</provider>

以上AndroidManifest的配置会导致APP启动时就对库自动进行初始化,如果不想自动初始化,可以稍微改下配置就行了.

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data
        android:name="com.hi.dhl.pokemon.init.AppInitializer"
        android:value="remove" />
</provider>

android:value="remove"这样子配置,打包的时候回将这个provider节点删除,APP启动的时候就不会自动初始化库了,然后可以选择手动初始化

AppInitializer.getInstance(this).initializeComponent(AppInitializer::class.java)

这个就是手动初始化的代码了.

猜你喜欢

转载自blog.csdn.net/MoLiao2046/article/details/109748174