路由映射

映射关系通过 Router#map 方法添加,Mapping 类记录了某个 Page 的映射路径

初始化,会在第一使用的时候完成,使用 @Module 后的每个模块内会生成一个 RouterMapping_xxx 的类来初始化当前模块的路由表,主模块还需要使用 @Modules 声明,并会生成一个 RouterInit 类以实现所有模块的

主模块初始化的时候,调用各个模块初始化自己的路由表

//APT 生成

public final class RouterInit {

public static final void init() {

RouterMapping_app.map();

RouterMapping_sdk.map();

}

}

app 模块的路由表初始化

//APT 生成

public final class RouterMapping_app {

public static final void map() {

//路由表初始化

//...

//@Router(value = "home/:homeName")

com.github.mzule.activityrouter.router.Routers.map("home/:homeName", HomeActivity.class, null, extraTypes);

//@Router("with_host")

com.github.mzule.activityrouter.router.Routers.map("with_host", HostActivity.class, null, extraTypes);

//@Router(value = {"http://mzule.com/main", "main", "home"})

com.github.mzule.activityrouter.router.Routers.map("http://mzule.com/main", MainActivity.class, null, extraTypes);

com.github.mzule.activityrouter.router.Routers.map("main", MainActivity.class, null, extraTypes);

com.github.mzule.activityrouter.router.Routers.map("home", MainActivity.class, null, extraTypes);

//...

}

}

启动页面

最后通过 Routers#doOpen 来启动一个 Activity

private static boolean doOpen(Context context, Uri uri, int requestCode) {

initIfNeed();

Path path = Path.create(uri);

for (Mapping mapping : mappings) {

if (mapping.match(path)) {

if (mapping.getActivity() == null) {

mapping.getMethod().invoke(context, mapping.parseExtras(uri));

return true;

}

Intent intent = new Intent(context, mapping.getActivity());

//...

if (requestCode >= 0) {

//...

} else {

context.startActivity(intent);

}

return true;

}

}

return false;

}

参数传递

可以通过 url 来传递一些基本类型的参数,如果需要传递对象类型的数据或者添加 launchFlag,只能通过 Router#resolve 方法来返回一个 Intent对象,这无疑打破的代码的简洁和优雅性,可以考虑构造一个新的对象来负责跳转和跳转前额外参数的添加职责(后面说的 Rabbit 就更合理且优雅)

具体流程

8b7a1825aa27

ActivityRouter启动页面流程.png

类图

8b7a1825aa27

ActivityRouter类图

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐