ARouter原理解析之仿ARouter自定义路由框架(1)

“dynamic”, // Group, 尽量保持和 path 的第一段相同

0, // 优先级,暂未使用

0 // Extra,用于给页面打标

)

);

}

});

ARouter详细API


// 构建标准的路由请求,并指定分组

ARouter.getInstance().build(“/home/main”, “ap”).navigation();

// 构建标准的路由请求,通过Uri直接解析

Uri uri;

ARouter.getInstance().build(uri).navigation();

// 构建标准的路由请求,startActivityForResult

// navigation的第一个参数必须是Activity,第二个参数则是RequestCode

ARouter.getInstance().build(“/home/main”, “ap”).navigation(this, 5);

// 指定Flag

ARouter.getInstance()

.build(“/home/main”)

.withFlags();

.navigation();

// 获取Fragment

Fragment fragment = (Fragment) ARouter.getInstance().build(“/test/fragment”).navigation();

// 对象传递

ARouter.getInstance()

.withObject(“key”, new TestObj(“Jack”, “Rose”))

.navigation();

// 使用绿色通道(跳过所有的拦截器)

ARouter.getInstance().build(“/home/main”).greenChannel().navigation();

原理探索


  • ARouter.init 时,通过获取/data/app/包名/base.apk来筛选出ARouter生成的类,如下图。

  • 对于Activity类型,跳转ARouter.getInstance().build("/login/login").navigation();,最终执行的是,如下:

**

  • Start activity

  • @see ActivityCompat

*/

private void startActivity(int requestCode, Context currentContext, Intent intent, Postcard postcard, NavigationCallback callback) {

if (requestCode >= 0) { // Need start for result

if (currentContext instanceof Activity) {//启动context 为Activity

ActivityCompat.startActivityForResult((Activity) currentContext, intent, requestCode, postcard.getOptionsBundle());

} else {

// 启动context 为Application 时,不支持requestCode

logger.warning(Consts.TAG, “Must use [navigation(activity, …)] to support [startActivityForResult]”);

}

} else {//启动context 为Application

ActivityCompat.startActivity(currentContext, intent, postcard.getOptionsBundle());

}

if ((-1 != postcard.getEnterAnim() && -1 != postcard.getExitAnim()) && currentContext instanceof Activity) { // Old version.

((Activity) currentContext).overridePendingTransition(postcard.getEnterAnim(), postcard.getExitAnim());

}

if (null != callback) { // Navigation over.

callback.onArrival(postcard);

}

}

  • 两个无关的module 如何跳转的呢?我们发现最终执行startActivity时,所用的context为Application,思路是这样的,子module启动另外无关子module时,将执行权,交还给主进程/主程序去处理

  • 打开生成路由文档,AROUTER_GENERATE_DOC=“enable”,会生成arouter-map-of-xx.json和3个java文件

// 更新 build.gradle, 添加参数 AROUTER_GENERATE_DOC = enable

// 生成的文档路径 : build/generated/ap_generated_sources/(debug or release)/com/alibaba/android/arouter/docs/arouter-map-of-${moduleName}.json

android {

defaultConfig {

javaCompileOptions {

annotationProcessorOptions {

arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: “enable”]

}

}

}

}

//ARouter映射关系如何生成?Generated出三个文件

//ARouter G r o u p Group Grouplogin

//ARouter P r o v i d e r s Providers Provid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值