ARouter原理解析之仿ARouter自定义路由框架,kotlin语言书籍

测试跳转

跳转登录android-ARouter

跳转登录android-ARouter 带参数

跳转android-ARouter 设置界面

跳转android-ARouter 设置界面

跳转android-ARouter 错误路径

关于拦截器


  • 拦截器(拦截跳转过程,面向切面编程)

  • 什么是面向切面编程AOP?AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

// 拦截器会在跳转之前执行,多个拦截器会按优先级顺序依次执行

@Interceptor(priority = 8, name = “测试用拦截器”)

public class TestInterceptor implements IInterceptor {

@Override

public void process(Postcard postcard, InterceptorCallback callback) {

callback.onContinue(postcard); // 处理完成,交还控制权

// callback.onInterrupt(new RuntimeException(“我觉得有点异常”)); // 觉得有问题,中断路由流程

// 以上两种至少需要调用其中一种,否则不会继续路由

}

@Override

public void init
(Context context) {

// 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次

}

}

动态路由


  • 动态注册路由信息 适用于部分插件化架构的App以及需要动态注册路由信息的场景,可以通过 ARouter 提供的接口实现动态注册 路由信息,目标页面和服务可以不标注 @Route 注解,注意:同一批次仅允许相同 group 的路由信息注册

ARouter.getInstance().addRouteGroup(new IRouteGroup() {

@Override

public void loadInto(Map<String, RouteMeta> atlas) {

atlas.put("/dynamic/activity", // path

RouteMeta.build(

RouteType.ACTIVITY, // 路由信息

TestDynamicActivity.class, // 目标的 Class

“/dynamic/activity”, // Path

“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(cur

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值