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> 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方法。
。。此时我们采用以上两种简单粗暴的方法实现了 ,这是我们能想到的最简单的方法。
我们接着继续研究,看看有没有更好的方法