凡是A,B无依赖关系,且想要互相通信的,其最基本的原理就是通过一个彼此都依赖的第三方C,不管是binder,socket,file,provider还是EventBus,Arouter等,都是这个原理。
一、模块间调用思路
假设现有: app、login、common三个module,其中app跟login无关联,并且都依赖于common,其中app中有个MainActivity,login想要调用MainActivity,根据上述,只能通过共同依赖的common 或 其他公有依赖来实现。
实现方案:
-
在common中定义一个Map<String,Class<? extends Activity>>。
-
2 在app中,将MainActivity.class添加到这个map中去。
map.put("main",MainActivity.class) -
3 在login中,通过map.get("main")得到MainActivity.class,然后创建Intent来启动MainActivity
Class<? extends Activity> mainActivityClass= map.get("main") startActivity(new Intent(this,mainActivityClass))
核心就两点: 注入 和 获取。说白了就是: 你把自己想让别人用的放进公共仓库中(注入),并提供一个凭证(这里的凭证就是字符串"main"),也就是key,想要的时候就拿着凭证从公共仓库中取出来(获取),公共仓库就是彼此都能访问的,那肯定是彼此都依赖的。
二、arouter原理
- 在编译时通过Apt技术,给代码中含有@Route(path)注解的类生成中间代码。
- Arouter.init(context)初始化时,进行注入操作,key就是path。
- Arouter.getIntstance().build(path).navigation()时候用path来进行获取操作,最终获取到要启动的Activity的class对象。