组件化开发中多个Application初始化

360 阅读1分钟

前言

在组件化开发中,为了解耦,需要在不同的组件中初始化第三方SDK或者其他配置,有的初始化因为特殊需要放在Application中。

所以Application分为了以下两种:

  1. App#Application
  2. Module#Application

但是一个APP中只能存在一个Application

只保留一个Application

自定义的Application需要在各个模块AndroidManifest.xml文件中的application节点中声明

<application
    android:name=".MyApplication">
    
    ......
    #do something
</application>

build时,子模块的AndroidManifest.xml都会按照优先级合并到app下的AndroidManifest.xml中。

合并优先级

App > Module

Manifest.xml中,Application节点下android:name属性为例(其他任意属性值同理),合并结果如下:

AppModule合并结果
------(使用系统默认)
--android:name="ModuleApplication"android:name="ModuleApplication"
android:name="AppApplication"--android:name="AppApplication"
android:name="AppApplication"android:name="ModuleApplication"冲突

当发生冲突时,会提示用'tools:replace="android:name'。但是如果使用这种解决方案,那么最终得到的结果只会保留AppApplicationModuleApplication丢失。

解决方案

  1. BaseApplication
abstract class BaseApplication : Application() {
    private val classInitList: MutableList<Class<out BaseAppInit>> = ArrayList()
    private val appInitList: MutableList<BaseAppInit> = ArrayList()
    override fun onCreate() {
        super.onCreate()
        appInit()
        initCreate()
    }

    protected abstract fun appInit()
    protected fun registerApplicationInit(classInit: Class<out BaseAppInit>) {
        classInitList.add(classInit)
    }

    private fun initCreate() {
        for (classInit in classInitList) {
            try {
                val appInit = classInit.newInstance()
                appInitList.add(appInit)
                appInit.onCreate()
                appInit.mApplication=this
            } catch (e: InstantiationException) {
                e.printStackTrace()
            } catch (e: IllegalAccessException) {
                e.printStackTrace()
            }
        }
    }

    override fun onTerminate() {
        super.onTerminate()
        for (appInit in appInitList) {
            appInit.onTerminate()
        }
    }

    override fun onLowMemory() {
        super.onLowMemory()
        for (appInit in appInitList) {
            appInit.onLowMemory()
        }
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        for (appInit in appInitList) {
            appInit.configurationChanged(newConfig)
        }
    }
}
  1. BaseAppInit
abstract class BaseAppInit {
    var mApplication: Application? = null

    fun onCreate() {}
    fun onTerminate() {}
    fun onLowMemory() {}
    fun configurationChanged(configuration: Configuration?) {}
}
  1. Module中使用
class ModuleApplication:BaseAppInit(){
    override fun onCreate(){
        //初始化第三方SDK
    }
    
    .....
}
  1. App中使用
class AppApplication:BaseApplication(){
    override fun appInit(){
        registerApplicationInit(ModuleApplication::class.java)
    }
    
    .....
}

文章鸣谢

Android组件化之Application