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

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

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

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

Android架构师-组件化-组件模块间交互 3_第1张图片

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

Android架构师-组件化-组件模块间交互 3_第2张图片

但是这种方法很容易出错

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

Android架构师-组件化-组件模块间交互 3_第3张图片

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

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

Android架构师-组件化-组件模块间交互 3_第4张图片

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

Android架构师-组件化-组件模块间交互 3_第5张图片

所以我们如果在单独运行(为了让数据完全隔离)的时候,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> 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 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 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方法。

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

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

 

 

 

 

你可能感兴趣的:(Android架构师-组件化-组件模块间交互 3)