Android架构师-组件化-组件模块间交互 3

1:子模块间(order/personal)相互交互

Module间怎么交互(包括跳转,传参等等)

比如:personal子模块需要跳转到order子模块怎么办?

实现方案一:类加载技术交互

但是这种方法很容易出错

实现方案二:全局map记录信息

这种方式我们来分析一下,

我们看一下当我们的config.gradle的isRelease为true的时候,我们Build Apk,然后分析一下这个apk

我们可以看到,当我们正式运行的时候,order和personal是在app的目录下的

所以我们如果在单独运行(为了让数据完全隔离)的时候,app想要调用其他moudle的时候就应该这样做:

思路:

1:此项操作在其他moudle也会调用,所以将管理类的代码放到common中

2:我们需要一个bean对象用来添加数据到集合中

3:还需要一个管理类,用来管理集合,向集合中添加数据,在集合中获取数据

在common中添加一个bean  PathBean

/**
 * 路径对象(公共基础库中,所有子模块都可以调用)
 * 如:
 * path : ”order/Order_MainActivity”
 * clazz : Order_MainActivity.class
 */
public class PathBean {

    private String path;
    private Class clazz;

    public PathBean() {
    }

    public PathBean(String path, Class clazz) {
        this.path = path;
        this.clazz = clazz;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public Class getClazz() {
        return clazz;
    }

    public void setClazz(Class clazz) {
        this.clazz = clazz;
    }
}

2:添加一个管理类

/**
 * 全局路径记录器(根据子模块分组)
 */
public class RecordPathManager {

    // key:"order"组     value:order子模块下,对应所有的Activity路径信息
    private static Map<String, List<PathBean>> groupMap = new HashMap<>();

    /**
     * 将路径信息加入全局Map
     *
     * @param groupName 组名,如:"personal"
     * @param pathName  路劲名,如:"Personal_MainActivity"
     * @param clazz     类对象,如:Personal_MainActivity.class
     */
    public static void joinGroup(String groupName, String pathName, Class<?> clazz) {
        List<PathBean> list = groupMap.get(groupName);
        if (list == null) {
            list = new ArrayList<>();
            list.add(new PathBean(pathName, clazz));
            groupMap.put(groupName, list);
        } else {
            groupMap.put(groupName, list);
        }
        groupMap.put(groupName, list);
    }

    /**
     * 根据组名和路径名获取类对象,达到跳转目的
     *
     * @param groupName 组名
     * @param pathName  路径名
     * @return 跳转目标的class类对象
     */
    public static Class<?> getTargetClass(String groupName, String pathName) {
        List<PathBean> list = groupMap.get(groupName);
        if (list == null) return null;
        for (PathBean path : list) {
            if (pathName.equalsIgnoreCase(path.getPath())) {
                return path.getClazz();
            }
        }
        return null;
    }

    /**
     * 清理、回收
     */
    public static void recycleGroup() {
        groupMap.clear();
        groupMap = null;
        System.gc();
    }

}

然后我们需要使用跳转的moudle中添加数据:

类似下面的代码:

public class AppApplication extends BaseApplication {

    @Override
    public void onCreate() {
        super.onCreate();
        // 如果项目有100个Activity,这种加法会不会太那个?
        RecordPathManager.joinGroup("app", "MainActivity", MainActivity.class);
        RecordPathManager.joinGroup("order", "Order_MainActivity", Order_MainActivity.class);
        RecordPathManager.joinGroup("personal", "Personal_MainActivity", Personal_MainActivity.class);
    }
}

当我们都初始化完成以后,比如在Order中跳转到personal中

   public void jumpPersonal(View view) {
        Class<?> targetClass = RecordPathManager.getTargetClass("personal", "Personal_MainActivity");

        if (targetClass == null) {
            Log.e(Cons.TAG, "获取跳转targetClass失败!");
            return;
        }

        Intent intent = new Intent(this, targetClass);
        intent.putExtra("name", "simon");
        startActivity(intent);
    }

就可以在moudle中实现跳转

有人说这是反射,但是反射其实是调用类的方法,属性,等,但是里面没有reject方法。

。。此时我们采用以上两种简单粗暴的方法实现了 ,这是我们能想到的最简单的方法。

我们接着继续研究,看看有没有更好的方法

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值