每个模块在启动的时候都会执行一些初始化操作,比如注册一些回调函数、创建一些对象等,如网络请求模块等。每个模块都有可能需要进行初始化操作,在初始化过程中,包括正式版初始化还有测试版初始化,如何去实现这些初始化操作呢?这就需要用到模块初始化管理。
我们可以在主应用中定义一个模块初始化管理类,然后在每个模块中实现这个类,这样就可以实现每个模块的初始化操作了。
我们在app-base
这个模块中的ModuleMediator
类型添加上初始化的接口,并且添加一个init
方法,如下所示:
package cn.jkdev.base
import android.app.Application
object ModuleMediator {
const val ACTIVITY_SETTING_CLASS = "cn.jkdev.setting.SettingActivity"
const val ACTIVITY_VIDEO_CLASS = "cn.jkdev.video.VideoActivity"
private const val APP_SETTING_CLASS = "cn.jkdev.setting.App"
private const val APP_VIDEO_CLASS = "cn.jkdev.video.App"
interface AppInitial {
fun init(app: Application)
}
fun init(app: Application) {
val appClasses = arrayOf(APP_SETTING_CLASS, APP_VIDEO_CLASS)
for (claName in appClasses) {
try {
val clazz = Class.forName(claName)
val appInitial = clazz.newInstance() as AppInitial
appInitial.init(app)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
然后在不同的子模块中添加一个App
类,这个类实现AppInitial
接口,如下所示:
package cn.jkdev.setting
import android.app.Application
import android.util.Log
import cn.jkdev.base.ModuleMediator
class App : ModuleMediator.AppInitial {
override fun init(app: Application) {
Log.i("SettingApp", "Setting module init")
}
}
当某个模块作为单独的独立模块时(即在debug模式下),我们在debug
包下使用App
类调用原始的init
方法,如下所示:
package cn.jkdev.video.debug
import android.app.Application
import cn.jkdev.video.App
class App : Application() {
override fun onCreate() {
super.onCreate()
App().init(this)
}
}
在debug
模式下,我们需要将debug
包下的App
类作为AndroidManifest.xml
中的Application
类,修改各个子模块如下的AndroidManifestDebug.xml
文件,在application
节点下添加如下一行代码:
android:name=".debug.App"
在主应用中,我们需要在Application
类中调用ModuleMediator
的init
方法,如下所示:
package cn.jkdev.modules
import android.app.Application
import cn.jkdev.base.ModuleMediator
class App : Application() {
override fun onCreate() {
super.onCreate()
ModuleMediator.init(this)
}
}
然后在AndroidManifest.xml
文件中将Application
类修改为App
类,如下所示:
android:name=".App"