Android组件化创建独立的Application,Appli
2021-08-23 本文已影响0人
风起于山巅
1.前言
网上的博文其他方面都讲解的很详细,唯独这一块说的不是很理想,所以笔者自己整理了一篇文章,提供参考。项目地址:https://gitee.com/hepta/AndroidModular
相关参考博文在主工程的App类中。
2.common库
在common库创建管理module初始化的工具类ModuleManager,通过反射获取对象,如果项目有混淆需要注意。
class ModuleManager private constructor() {
private var moduleNames = arrayOf(SOUTH_APP, NORTH_APP)
private var modules = mutableListOf<ModuleSource>()
init {
// 初始化app
for (name in moduleNames) {
try {
val clazz = Class.forName(name)
modules.add(clazz.newInstance() as ModuleSource)
} catch (e: ClassNotFoundException) {
e.printStackTrace()
} catch (e: InstantiationException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
}
}
private object SingleHolder {
val instance = ModuleManager()
}
fun onCreate() {
for (module in modules) {
module.onCreate()
}
}
fun onLowMemory() {
for (module in modules) {
module.onLowMemory()
}
}
fun onConfigurationChanged(newConfig: Configuration) {
for (module in modules) {
module.onConfigurationChanged(newConfig)
}
}
companion object {
val instance: ModuleManager
get() = SingleHolder.instance
// 类描述: 组件生命周期初始化类的类目管理者,在这里注册需要初始化的组件,通过反射动态调用各个组件的初始化方法
private const val SOUTH_APP = "com.tao.south.SouthModule"
private const val NORTH_APP = "com.tao.north.NorthModule"
}
}
3.主工程的application
在主工程的application中通过ModuleManager初始化module
class App : BaseApp() {
override fun onCreate() {
super.onCreate()
XLog.e("App Init")
ModuleManager.instance.onCreate()
}
override fun onLowMemory() {
super.onLowMemory()
ModuleManager.instance.onLowMemory()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
ModuleManager.instance.onConfigurationChanged(newConfig)
}
}
4.model的application
需要创建两个类做初始化用,NorthApp以及NorthModule,NorthApp提供module独立运行时AndroidManifest.xml使用,NorthModule作为module模块时使用。
/**
* 作为独立运行的Application
*/
class NorthApp : BaseApp() {
private val module = NorthModule()
override fun onCreate() {
super.onCreate()
XLog.e("NorthApp Init")
module.onCreate()
}
}
class NorthModule : ModuleSource {
override fun onCreate() {
super.onCreate()
XLog.e("NorthModule Init")
}
}