Jetpack StartUp

在翻看Android文档的时候看到jetpack有个StartUp组件,好奇就查了下它的用途

App的初始化

我们现在很多初始化sdk库的方式一般为:

class App: Application() {
    override fun onCreate(){
        ASDK.init()
        BSDK.init()
        CSDK.init(this)    
    }
}

还有一种初始化sdk的方式是放在ContentProvider中, privder初始化的时机早于Application的onCreate

Application 构造方法 –> Application.attachBaseContext –> ContentProvider
构造方法 –> ContentProvider.onCreate –> Application.onCreate –> Activity
构造方法 –> Activity attachBaseContext –> Activity.onCreate

所以在Provider中初始化也有一定的局限性,那就是不能强依赖application。
所以一些SDK在ContentProvider中进行了初始化,这种方式的优点就是:
与宿主项目解耦,开发者无需特殊配置,sdk自动初始化。
目前看到JetPack的一些SDK就是这样初始化的:


    
    
    

每个ContentProvider的初始化都是耗时的, 如果每个sdk或者module都这样使用的话,就会出现启动慢的情况。
这时如果把ContentProvider合并到一起的话,就不会出现这个问题了,所以StartUp就出现了。

StartUp的作用

文档对它的描述

App Startup 库提供了一种直接、高效的方法来在应用程序启动时初始化组件。 库开发人员和应用程序开发人员都可以使用 App
Startup 来简化启动顺序并明确设置初始化顺序。

App Startup 允许您定义共享单个内容提供程序的组件初始化程序,而不是为您需要初始化的每个组件定义单独的内容提供程序。 这可以显着缩短应用程序启动时间。
从上面的文档上就可以总结下它的作用:
简化启动顺序、设置初始化顺序
实现StartUp提供的接口即可,无需自定义ContentProvider
合并Initializer到一个ContentProvider,减少启动时间。
接下来我们看下如何使用及这些作用的体现

StartUp的使用方法

添加StartUp库

dependencies {
    implementation "androidx.startup:startup-runtime:1.1.1"
}

实现Intiallizer方法

class SimpleInitializer: Initializer {
    @SuppressLint("RestrictedApi")
    override fun create(context: Context): String {
        // WorkManager 已经初始化完成了
        val workManager = WorkManager.getInstance(context)
        val result: String = doSomeThing(workManager)
        return result
    }

    /**
     * [create] 之前的依赖,就是必须要依赖初始化完成后才能执行[create], 这个就是顺序执行
     * 上面的AndroidManifest分析中我们已经看到 [WorkManager] 的 [WorkManagerInitializer] 已经通过StartUp初始化了
     */
    override fun dependencies(): MutableList>> {
        return mutableListOf(WorkManagerInitializer::class.java)
    }
}

在AndroidManifest中添加provider


    

这样配置就可以了。
如果不想在这里初始化,想要自定义初始化时机。



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

解析apk中的AndroidManifest可以看到已加入到provider中


            
            
            
            

总结:

实际开发中大部分三方的SDK都是需要application作为依赖的,所以使用StartUp的机会并不多。如果是不依赖的建议使用这种方式,毕竟我们使用的jetpack都已经用它初始化了,我们在里面多加一条,相当于搭了顺风车,省时省力。
虽然用它不多,但是可以借鉴它的实现初始化顺序的思想可以借鉴下,在application中应用。具体实现详情还需看源码解析。

你可能感兴趣的:(android,android,jetpack,kotlin)