架构师(四)——组件化子模块交互

假设有两个子模块order和persional,以及公共库common


image.png

由于是子模块,他们没有互相依赖(就是在build.gradle中implementation project(':personal'))
所有的模块都添加了common依赖

如果order要访问personal,可以有以下方式
一、类加载跳转

//类加载跳转,可以成功。维护成本较高且容易出现人为失误
try {
    Class targetClass = Class.forName("com.netease.modular.personal.Personal_MainActivity");
    Intent intent = new Intent(this, targetClass);
    intent.putExtra("name", "simon");
    startActivity(intent);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

二、使用全局map记录类
在common中创建记录类

/**
 * 全局路径记录器(根据子模块分组)
 */
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();
    }

}

接下来就要把所有的类记录下来,需要在application中加入

public class AppApplication extends BaseApplication {

    @Override
    public void onCreate() {
        super.onCreate();
        RecordPathManager.joinGroup("app", "MainActivity", MainActivity.class);
        RecordPathManager.joinGroup("order", "Order_MainActivity", Order_MainActivity.class);
        RecordPathManager.joinGroup("personal", "Personal_MainActivity", Personal_MainActivity.class);
    }
}

当需要跳转的时候

Class targetClass = RecordPathManager.getTargetClass("app", "MainActivity");

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

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

你可能感兴趣的:(架构师(四)——组件化子模块交互)