扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章主要介绍了使用Android怎么模块化中实现数据传递和路由跳转,创新互联小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随创新互联小编来看看吧!
创新互联专注于尖扎网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供尖扎营销型网站建设,尖扎网站制作、尖扎网页设计、尖扎网站官网定制、成都小程序开发服务,打造尖扎网络公司原创品牌,更为您提供尖扎网站排名全网营销落地服务。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。
模块通信
首先,统一声明姿势:
public interface IComponent { String getName(); void startComponent(ComponentParam param); }
也就是说,在各自的维护的模块内若想提供一个类供别的模块调用那么需要实现这个 IComponent 类,这样子可以根据面向对象的优势统一管理,所以我们就有了接下来的这么一个个Component类,比如:
@NeacyComponent("app") public class AppComponent implements IComponent { @Override public String getName() { return "app"; } @Override public void startComponent(ComponentParam param) { Log.w("Jayuchou", "==== Start AppComponent ===="); if (param != null && param.getParam().containsKey("callback")) { ICallBack callBack = (ICallBack) param.getParam().get("callback"); Mapresults = new HashMap<>(); results.put("result", "我来自AppComponent"); ComponentParam cp = new ComponentParam(results); callBack.onComponentBack(cp); } } }
两个地方比较重要:
NeacyComponent 这个注释,主要是为后面的gradle扫描使用
getName() 这个方法返回每个 IComponent 对应的实例key值,方便在不同的模块我们可以根据这个key值找到对应的 IComponent 对象
其次,如何调用呢?
ComponentController.getComponentByName("app").startComponent(null);
是的,只要根据app这个key值我们就能轻易的找到对应的 IComponent 对象,从而执行 startComponent ,这个方法就是你想要在该模块做的逻辑地方。
看上面我们声明的 AppComponent 类,我们在 startComponent 有判断一下传入的参数是否为空,这里直接放了一个伪 Map 类专门用于存放传递的参数。
如何回调结果以及如何获取别的模块的回调结果?
首先你执行了别的模块的 startComponent 方法,在这个方法中你返回的类肯定只有对应的模块能识别,也就是说你在自己模块获取不到别的模块中的类,所以这里使用 ComponentParam 采用key/value的风格存放参数以及回调返回结果,然后看一下下面的代码就能明白答案了。
// 传递参数给IComponent, 可以通过传递回调函数从而得到回调结果 Mapp = new HashMap<>(); p.put("callback", new ICallBack() { @Override public void onComponentBack(ComponentParam result) { Log.w("Jayuchou", "==== 运行结果 = " + result.getParam().get("result")); } }); ComponentParam cp = new ComponentParam(p); // 回调结果回去 ICallBack callBack = (ICallBack) param.getParam().get("callback"); Map results = new HashMap<>(); results.put("result", "我来自AppComponent"); ComponentParam cp = new ComponentParam(results); callBack.onComponentBack(cp); // 调用的时候传入参数即可 ComponentController.getComponentByName("app").startComponent(cp);
路由跳转
首先,老规矩肯定也是声明一下路由协议(这里只是一个简单的字符串)
@NeacyProtocol("/activity/a") public class AActivity extends AppCompatActivity @NeacyProtocol("/activity/b") public class BActivity extends AppCompatActivity @NeacyProtocol("/activity/app") public class MainActivity extends AppCompatActivity
然后调用就是了:
RouterController.startRouter(MainActivity.this, "/activity/a");// 跳转到AActivity Bundle args = new Bundle(); args.putString("key", "AActivity"); RouterController.startRouter(AActivity.this, "/activity/b", args);// 跳转到BActivity并携带bundle参数
原理
原理就是通过gradle插件结合ASM扫描注解并在编译的时候注入代码,我们先看下注入成功后的代码结构:
1.模块通信的注入结果
public class ComponentController { static { registerComponent(new AComponent()); registerComponent(new BComponent()); registerComponent(new AppComponent()); } private static Mapcomponents = new HashMap(); static void registerComponent(IComponent component) { components.put(component.getName(), component); } . . . }
2.路由跳转注入结果
public class RouterController { static { addRouter("/activity/a", "com.neacy.neacy_a.AActivity"); addRouter("/activity/b", "com.neacy.neacy_b.BActivity"); addRouter("/activity/app", "com.neacy.component.MainActivity"); } private static Maprouters = new HashMap(); public static void addRouter(String key, String value) { routers.put(key, value); } }
以上就是创新互联小编为大家收集整理的使用Android怎么模块化中实现数据传递和路由跳转,如何觉得创新互联网站的内容还不错,欢迎将创新互联网站推荐给身边好友。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流