关于@Route注解
阿里巴巴开源的路由框架:https://github.com/alibaba/ARouter
先说一下,组件化中使用intent依然可以实现跳转,但是仅限于本module
不同moule之间跳转需要设置大量的tag标记,浪费资源
先说下组件化:
组件化是最近比较流行的架构设计方案,它能对代码进行高度的解耦、模块分离等,极大地提高开发效率
路由和组件化本身没有什么联系,因为路由的责任是负责页面跳转,但是组件化中两个单向依赖的module之间需要互相启动对方的Activity,因为没有相互引用,startActivity()是实现不了的,
在需要对其他module提供调用的Activity中,都需要声明@Route注解,我们称之为路由地址。
@Route(path = “/userCenter/login”)
public class MyClass {…}
路由框架会在项目的编译期通过注解处理器扫描所有@Route注解的Activity类,然后将Route注解中的path地址和Activity.class文件的映射关系保存到它自己生成的java文件的map中。
public class MyRouters {
//项目编译后通过apt生成如下方法
public static HashMap<String, ClassBean> getRouteInfo(HashMap<String, ClassBean> routes) {
route.put("/userCenter/login", LoginActivity.class);
route.put("/userCenter/register”, RegisterActivity.class);
}
}
ARouter路由跳转的实现
- //用ARouter启动Activity,代码如下:
-
ARouter.getInstance().build("/userCenter/login").navigation();
-
public void login(String name, String password) {
-
HashMap<String, ClassBean> route = MyRouters.getRouteInfo(new HashMap<String, ClassBean>);
-
LoginActivity.class classBean = route.get("/userCenter/login");
-
Intent intent = new Intent(this, classBean);
-
intent.putExtra("name", name);
-
intent.putExtra("password", password);
-
startActivity(intent);
- }
路由框架在这个时期根据注解@Route去扫描所有文件,然后生成路由映射文件(path和activity.class)。这些文件都会统一打包到apk里。
apt生成的路由映射关系文件,在项目编译后会在各个模块的/build/generated/source/apt文件夹下面生成。
总结:
1.编译期
路由框架在这个时期根据注解@Route去扫描所有文件,然后生成路由映射文件(path和activity.class)。这些文件都会统一打包到apk里。
apt生成的路由映射关系文件,在项目编译后会在各个模块的/build/generated/source/apt文件夹下面生成。
2.运行期:
使用路由跳转之前需要获取路由映射关系并保存到内存中。那么获取路由关系最好的时机就是应用程序初始化的时候,也就是我们的ARouter.init()方法;它会加载我们在编译时期生成的路由映射关系文件,获取映射关系保存到内存(map)中。
3.页面跳转
进行路由跳转的时候,通过build()方法传入目标页面的路由地址,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class(activity.class = map.get(path)),然后new Intent(context, activity.Class),当调用ARouter的withString()方法它的内部会调用intent.putExtra(String name, String value),调用navigation()方法,它的内部会调用startActivity(intent)进行跳转,这样便可以实现两个相互没有依赖的module顺利的启动对方的Activity了。
补充:
1:组件化中模块之间的Activity跳转,为什么选择ARouter路由跳转
1):隐式跳转,但是一个项目中不可能所有的跳转都是隐式的,这样Manifest文件会有很多过滤配置,而且非常不利于后期维护。
2):反射拿到Activity的class文件也可以实现跳转,
缺点:1大量的使用反射跳转对性能会有影响,
2.需要拿到Activity的类文件,在组件开发的时候,想拿到其他module的类文件是很麻烦的,因为组件开发的时候组件module之间是没有相互引用的,你只能通过找到类的路径去反射拿到这个class。
2:什么是APT
APT是Annotation Processing Tool的简称,即注解处理工具。apt是在编译期对代码中指定的注解进行解析,然后做一些其他处理(如通过javapoet生成新的Java文件)。我们常用的ButterKnife,其原理就是通过注解处理器在编译期扫描代码中加入的@BindView、@OnClick等注解进行扫描处理,然后生成XXX_ViewBinding类,实现了view的绑定。