1,大伙熟悉的ARoute有以下功能
可以让两个模块在不耦合的情况下,实现:
1)Activity跳转
2)接口实例跨模块传递
3)通过url指定特定的Activity跳转
4)通过拦截器,对各种操作进行拦截处理
在执行上面操作时,还有回调来监听过程结果。
2,分析路由框架的实现原理

用图表示的话,初始化阶段是可提供路由的元素向路由模块注册:

然后就可以通过字符串进行路由跳转了:

3,代码自动生成原理
使用Annotation Processing Tool实现,即编译时注解技术(APT)。
首先实现自定义注解,需要以下几步:
1,定义自己的注解接口名称,并指定元注解(标识注解属性的注解)ElementType和RetentionPolicy中的值:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Route {
String path();
}
2,编写注解解释器。同样需要指定元注解
/**
动态加载注解解释器,以实现注解处理器的自动注册(不需要手动调用注册)
@AutoService(Processor.class)
/**
处理器接收的参数 替代 {@link AbstractProcessor#getSupportedOptions()} 函数
*/
@SupportedOptions("moduleName")
/**
* 指定使用的Java版本 替代 {@link AbstractProcessor#getSupportedSourceVersion()} 函数
*/
@SupportedSourceVersion(SourceVersion.RELEASE_7)
/**
* 注册给哪些注解的 替代 {@link AbstractProcessor#getSupportedAnnotationTypes()} 函数
*/
@SupportedAnnotationTypes("com.xsm.easy.annotation.Route")
public class RouterProcessor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
//该方法主要用于一些初始化的操作
//通过该方法的参数ProcessingEnvironment可以获取一些列有用的工具类
}
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
//获取同一个类中的所有指定注解修饰的参数值
//创建Java文件
}
}
3,引入依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.auto.service:auto-service:1.0-rc2'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc2'
implementation 'com.squareup:javapoet:1.7.0'
}
squareup:javapoet是用来生成java文件的一个库。具体使用可以查询javapoet语法介绍。编译后生成的java文件会存放在build\generated\source\apt中。
使用时,我们在需要路由的元素上加上注解,如:
@Route(path = "/main/main")
public class MainActivity extends AppCompatActivity {
路由管理类的作用
配置完了注解,我们就可以在RouterProcessor中,获取添加了注解的元素的信息,将这些信息在应用初始化时,放入自动生成的路由管理类:
//该类是通过javapoet自动生成的
public class EaseRouter_Group_main implements IRouteGroup {
@Override
public void loadInto(Map<String, RouteMeta> atlas) {
atlas.put("/main/main",RouteMeta.build(RouteMeta.Type.ACTIVITY,MainActivity.class,"/main/main","main"));
atlas.put("/main/main2",RouteMeta.build(RouteMeta.Type.ACTIVITY,Main2Activity.class,"/main/main2","main"));
}
}
代码中可以通过路由进行跳转:
EasyRouter.getsInstance().build("/module2/module2main").navigation(this, new NavigationCallback() {
//回调
...
}
最终是在路由模块中执行startActivity。
网友评论