微信公众号:Android研究院 关注可了解更多的Android知识,专注于移动领域,不知代码还有人生的哲学。 问题或建议,请公众号留言; 如果你觉得文章对你有帮助,欢迎赞赏[1]
上一篇文章,讲解了路由框架实现的原理,并实现了基本的路由框架 页面路由的跳转 Android组件化专题 - 路由框架原理。
本篇文章来对基础的路由框架进阶,来实现模块间的业务通信功能。
代码地址
我们来看以下实现的效果图:
app --> module1 | module1 --> module2 |
---|---|
image.png | image.png |
首先我们先回顾,路由框架的设计思路,如下图:
image.png
路由框架的实现思路很容易理解,建议手撸一遍,基本掌握这种实现思路。
如何在路由框架的基础上扩展模块间的业务通信呢?
只要弄懂了路由框架的原理,模块间的业务通信就很容易实现了。
我们继续在上一遍文章的代码扩展。
//获得Activity的类型
TypeElement activity = elementUtils.getTypeElement(Consts.Activity);
//获取Service的类型
TypeElement service = elementUtils.getTypeElement(Consts.Service);
//只能指定的类上面使用
if (typeUtils.isSubtype(typeMirror, activity.asType())) {
//存储路由相关的信息
routerMeta = new RouterMeta(RouterMeta.Type.ACTIVITY, annotation, element);
} else if (typeUtils.isSubtype(typeMirror, service.asType())) {
//存储路由相关的信息
routerMeta = new RouterMeta(RouterMeta.Type.SERVICE, annotation, element);
} else {
throw new RuntimeException("Just Support Activity Router!");
}
Service 类是在primrouter-core 核心库中的一个接口类
public static final String Service = "com.primrouter_core.interfaces.IService";
这个空接口,就是为了实现业务间的通信
public interface IService {
}
在生成跳卡的方法中扩展如下代码,实际上就是将IService 的具体实现存到JumpCard 中去。
private void produceJumpCard(JumpCard card){
if{
........
} else {
//设置要跳转的类
card.setDestination(routerMeta.getDestination());
//设置要跳转的类型
card.setType(routerMeta.getType());
switch (routerMeta.getType()) {
case SERVICE:
Class<?> destination = routerMeta.getDestination();
IService iService = Depository.serviceMap.get(destination);
if (iService == null) {
iService = (IService) destination.getConstructor().newInstance();
Depository.serviceMap.put(destination, iService);
}
card.setService(iService);
break;
default:
break;
}
}
}
然后直接返回IService 转换成 IService 的子类。
public Object navigation(Context context, final JumpCard jumpCard, final int requestCode, Object o1) {
..........
..........
..........
case SERVICE:
Log.e(TAG, "navigation: " + jumpCard.getService());
return jumpCard.getService();
}
extends IService
public interface TestService extends IService {
void test(Context context,String s);
}
然后哪个模块需要TestService业务逻辑,就实现具体的TestService,并注解@Router(path),
app:
@Router(path = "/app/service")
public class AppService implements TestService {
@Override
public void test(Context context, String s) {
Toast.makeText(context, "我是app,我是被:" + s + "模块调用的,模块间通信测试成功", Toast.LENGTH_SHORT).show();
}
}
module1:
@Router(path = "/module1/service")
public class Module1Service implements TestService {
private static final String TAG = "Module1Service";
@Override
public void test(Context context, String s) {
Toast.makeText(context, "我是Module1,我是被:" + s + "模块调用的,模块测试通信成功", Toast.LENGTH_SHORT).show();
}
}
module2:
@Router(path = "/module2/service")
public class Module2Service implements TestService {
@Override
public void test(Context context, String s) {
Toast.makeText(context, "我是Module2,我是被:" + s + "模块调用的,模块测试通信成功", Toast.LENGTH_SHORT).show();
}
}
调用方式: 可以在任意模块调用
TestService testService = (TestService) PrimRouter.getInstance().jump("/module1/service").navigation();
testService.test(this, "app");
运行效果如下图所示:
image.png
Android的组件化专题: 组件化配置
APT实战
路由框架原理
模块间的业务通信
下一篇:Activity跳转参数自动注入和Fragment的跳转。