美文网首页
Android组件化学习-子模块间交互

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

作者: Lucky胡 | 来源:发表于2020-03-26 11:42 被阅读0次

    涉及的基础知识

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

    相关文章

      网友评论

          本文标题:Android组件化学习-子模块间交互

          本文链接:https://www.haomeiwen.com/subject/gwgquhtx.html