前言
学习了ARouter的使用,以及Activity的跳转流程,今天来学习下关于路径与自动生成的文件等对应关系。
关于用到的注解@Router 、@Interceptor、@Autowired下次再学。先把整个对应关系看到了,再学习会觉得形象些。
Route关系说明
Route主要有两个属性,path和group。如:@Route(path = “/app/ListPage”, group = “”)
第一个参数path是路径,group是分组
如上参数group为空,会默认使用path中解析;规则为第一个以‘/’分割的单词。如上格式,最终自动生成的路由表中就是这样的(路由表其实就是通过编译注解将path group class等信息生成map形式的代码,文件也是新生成)。
如下所示:
public class ARouter$$Group$$app implements IRouteGroup {
@Override
public void loadInto(Map<String, RouteMeta> atlas) {
atlas.put("/app/ListPage", RouteMeta.build(RouteType.ACTIVITY, ListActivity.class, "/app/listpage", "app", new java.util.HashMap<String, Integer>(){{put("name", 8); }}, -1, -2147483648));
atlas.put("/app/main", RouteMeta.build(RouteType.ACTIVITY, ArouterMainActivity.class, "/app/main", "app", null, -1, -2147483648));
}
}
Map<String, RouteMeta> atlas:string为path名称,RouteMeta为类型、class、路径、分组等信息。
如上,/app/main所属组就是app。
综上,一个@Route(path = “/app/ListPage”, group = “”)路径,会被解释为一个文件:ARouter$$Group$$app
。( 规则是:ARouter$$Group$$组名
)。
文件路径为:generated\source\apt\debug\com\alibaba\android\arouter\routes\ARouter$$Group$$app.java
如增加一个路径:
@Route(path = “/main/dialogrouteservice”)/,此时会生成文件ARouter$$Group$$main.java
如下:
public class ARouter$$Group$$main implements IRouteGroup {
@Override
public void loadInto(Map<String, RouteMeta> atlas) {
atlas.put("/main/dialogrouteservice", RouteMeta.build(RouteType.PROVIDER, DialogRouteService.class, "/main/dialogrouteservice", "main", null, -1, -2147483648));
}
}
Interceptor关系说明
作用:设置全局跳转的拦截器,可以设置优先级。@Interceptor(priority = 1)priority 为优先级。
@Interceptor(priority = 1)
public class ListInterceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.i("ListInterceptor", "process in." + Thread.currentThread().getName());
}
@Override
public void init(Context context) {
Log.i("ListInterceptor", "init in." + Thread.currentThread().getName());
}
}
处理注解基本和和@Route一样的。会根据路径,在注解处理时候生成文件:
public class ARouter$$Interceptors$$app implements IInterceptorGroup {
@Override
public void loadInto(Map<Integer, Class<? extends IInterceptor>> interceptors) {
interceptors.put(1, ListInterceptor.class);
interceptors.put(7, TopInterceptor.class);
}
}
Map<Integer, Class<? extends IInterceptor>> interceptors:其中key为优先级值,class为对应的拦截器类。
map是个特别的map,根据key的值自动排序,如果key重复会异常,也是这个拦截器可以按优先级排序的原因。