Android组件化学习-子模块间交互

2020-03-26  本文已影响0人  Lucky胡

涉及的基础知识

gradle学习使用
Android组件化学习-项目架构

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介绍与使用

上一篇下一篇

猜你喜欢

热点阅读