1、单向依赖的module之间
组件化中两个单向依赖的module之间需要互相启动对方的Activity时,因为没有相互引用,startActivity()是实现不了的,必须需要一个协定的通信方式,此时类似ARouter的路由框架就派上用场了。
2、互不依赖的module之间
两个module之间没有依赖,便不能通过startActivity()的显示启动进行通信,那么如何进行通信呢?
(1)隐式跳转:这是一种解决方法,但是一个项目中不可能所有的跳转都是隐式的,这样Manifest文件会有很多过滤配置,而且非常不利于后期维护。
(2)反射:当然你用反射拿到Activity的class文件也可以实现跳转,但是大量的使用反射跳转对性能会有影响。
(3)路由框架。
3、ARouter原理
(1)在每个需要对其他module提供调用的Activity中,都会声明类似下面@Route注解,我们称之为路由地址。
@Route(path = "/main/main")
public class MainActivity extends AppCompatActivity {}
@Route(path = "/module1/module1main")
public class Module1MainActivity extends AppCompatActivity {}
(2)编译期时生成路由映射
路由框架会在项目的编译期通过注解处理器apt扫描所有添加@Route注解的Activity类,然后将Route注解中的path地址和Activity.class文件映射关系保存到它自己生成的java文件中,只要拿到了映射关系便能拿到Activity.class。
route.put("/main/main", MainActivity.class);
route.put("/module1/module1main", Module1MainActivity.class);
route.put("/login/login", LoginActivity.class);
(3)不同module之间启动Activity
public void login(String name, String password) {
LoginActivity.class classBean = route.get("/login/login");
Intent intent = new Intent(this, classBean);
intent.putExtra("name", name);
intent.putExtra("password", password);
startActivity(intent);
}
(4)ARouter使用
ARouter.getInstance().build("/test/login")
.withString("password", 666666)
.withString("name", "小三")
.navigation();
ARouter背后的实现原理其实跟上面讲解是一样的。
4、apt & javapoet
apt是在编译期对代码中指定的注解进行解析,然后做一些其他处理(如通过javapoet生成新的Java文件)。我们常用的ButterKnife,其原理就是通过注解处理器在编译期扫描代码中加入的@BindView、@OnClick等注解进行扫描处理,然后生成XXX_ViewBinding类&#x