前言
在组件化开发中,为了解耦,需要在不同的组件中初始化第三方SDK或者其他配置,有的初始化因为特殊需要放在Application中。
所以Application分为了以下两种:
App#ApplicationModule#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属性为例(其他任意属性值同理),合并结果如下:
App | Module | 合并结果 |
|---|---|---|
| -- | -- | --(使用系统默认) |
| -- | android:name="ModuleApplication" | android:name="ModuleApplication" |
android:name="AppApplication" | -- | android:name="AppApplication" |
android:name="AppApplication" | android:name="ModuleApplication" | 冲突 |
当发生冲突时,会提示用'tools:replace="android:name'。但是如果使用这种解决方案,那么最终得到的结果只会保留AppApplication,ModuleApplication丢失。
解决方案
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)
}
}
}
BaseAppInit
abstract class BaseAppInit {
var mApplication: Application? = null
fun onCreate() {}
fun onTerminate() {}
fun onLowMemory() {}
fun configurationChanged(configuration: Configuration?) {}
}
Module中使用
class ModuleApplication:BaseAppInit(){
override fun onCreate(){
//初始化第三方SDK
}
.....
}
App中使用
class AppApplication:BaseApplication(){
override fun appInit(){
registerApplicationInit(ModuleApplication::class.java)
}
.....
}
文章鸣谢