涉及的基础知识
Module和Module之间的交互
组件化下,高度解耦的Module之间怎么交互?(包括跳转、传参等)
EventBus :EventBean会非常多,容易出现混乱,难以维护;如果两个Module有一样的EventBean,会发送错误。
反射 :反射可以但是维护成本高,可能高版本有点反射方法不能用了。
隐式意图:维护成本低,但是需要维护Manifest都有action。
BroadCastReceiver :需要动态注册
类加载:需要准确的全类名路径,麻烦。
全局Map记录信息
将一个记录模块加载类路径放在公共模块中,每个子模块都能在该公共模块里读写数据,这样就能获得全类名路径,可以类加载。
类加载方法,这样的方法会需要记住全路径,但是其他模块一旦修改了类名,就到处都需要修改。
fun jumpToApp(){
//用类加载方式跳转
val clz = Class.forName("com.hujun.modulize.MainActivity")
val intent = Intent(this,clz)
startActivity(intent)
}
fun jumpToPersonal(){
//用类加载方式跳转
val clz = Class.forName("com.hujun.modulize.personal.PersonalMainActivity")
val intent = Intent(this,clz)
startActivity(intent)
}
上面需要写类全名,可以一次注册到全局Map里,这样调用方便。
/**
* Created by junhu on 2020/3/27
* 路径对象,公共基础库中,所有子模块都可以调用
* path : "order/Order_MainActivity"这样
* clazz : "Order_MainActivity.class"
*/
data class PathBean(var path:String?=null,var clazz:Class<*>?=null)
路径管理器:
/**
* Created by junhu on 2020/3/27
* 全局路径记录,根据子模块分组
*/
class RecordPathManager {
companion object {
//key : order分组
//value : order子模块下,对应所有的Activity路径信息
private val groupMap = mutableMapOf<String, MutableList<PathBean>>()
fun joinGroup(groupName: String, pathName: String, clazz: Class<*>) {
var list = groupMap[groupName]
if (list == null) {
list = arrayListOf(PathBean(pathName, clazz))
groupMap[groupName] = list
} else {
var hasPath = false
list.forEach {
if (pathName.equals(it.path, true)) {
hasPath = true
}
}
if (!hasPath)
list.add(PathBean(pathName, clazz))
}
}
fun getTargetClass(groupName: String, pathName: String): Class<*>? {
val list = groupMap[groupName] ?: return null
list.forEach {
if (pathName.equals(it.path, true)) {
return it.clazz
}
}
return null
}
}
}
但是这样做的缺点在于,如果有很多子模块,子模块里有很多Activity,那就需要注册很多很多路径。非常麻烦。
RecordPathManager.joinGroup("app","MainActivity",MainActivity::class.java)
RecordPathManager.joinGroup("order","Order_MainActivity",Order_MainActivity::class.java)
RecordPathManager.joinGroup("personal","PersonalMainActivity",PersonalMainActivity::class.java)
那如何实现自动化的代码生成呢?
这就需要使用APT技术。
APT介绍与使用
网友评论