路由框架ARouter的使用与原理分析

本文详细介绍了ARouter路由框架的使用与原理,包括组件化的概念,原生路由方案的局限,ARouter如何解决这些问题,以及ARouter的初始化过程和路由跳转流程。文章还涵盖了ARouter的基本使用步骤、拦截器实现、服务管理和分组管理,揭示了ARouter如何通过AOP支持拦截器和降低组件间耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Arouter简介

 ARouter是阿里开源的一款路由框架,为组件化提供解决方案,它支持解析标准URL进行跳转,并自动注入参数到目标页面中;支持添加多个拦截器,自定义拦截顺序。
所谓组件化就是将APP按照一定的功能和业务拆分成多个小组件,不同的组件由不同的开发小组来负责,这样就可以解决大型APP开发过程中的开发与协作的问题,将这些问题分散到小的APP中。

(1)原生路由方案:使用显示Intent和隐式Intent跳转

  • 显示Intent存在直接依赖,耦合度过高;
  • 隐式Intent存在规则集中式管理Path,导致协作困难;
  • 原生路由跳转一旦调用startActivity,后面的流程将无法进行控制拦截;

(2)ARouter自定义路由方案:使用解析标准URL跳转

  • 通过解析URL索引进行跳转,解决依赖的问题;
  • 通过分布式管理页面配置,解决隐式Intent中集中式管理Path的问题;
  • 通过AOP方式支持添加多个拦截器并自定义拦截顺序,解决跳转过程中无法控制的问题;
  • 整个路由跳转过程透明,拥有更好的扩展性;

2. ARouter基本使用

ARouter Github地址: https://github.com/alibaba/ARouter

(1)配置app的build.gradle;

android {
   
   
    defaultConfig {
   
   
        ...
        javaCompileOptions {
   
   
            annotationProcessorOptions {
   
   
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}

dependencies {
   
   
    // Replace with the latest version
    implementation 'com.alibaba:arouter-api:1.5.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1' // 注解处理器
    ...
}

 如果使用Kotlin开发,将上述配置改为:

// 添加'kotlin-kapt'插件
apply plugin: 'kotlin-kapt'

android {
   
   
    kapt {
   
   
          arguments {
   
   
               arg("AROUTER_MODULE_NAME", project.getName())
          }
    }
}

dependencies {
   
   
    implementation 'com.alibaba:arouter-api:1.5.1'
    kapt 'com.alibaba:arouter-compiler:1.5.1' // 注解处理器
    ...
}

(2)初始化SDK,释放ARouter资源?;

public WanFlutterApplication extends Application {
   
   

    private boolean isDebug = true;

    @Override
    public void onCreate() {
   
   
        if (isDebug) {
   
              // 在init方法之前调用,否则不起作用
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // InstantRun mode需开启调试模式,但是线上需将其关闭
        }
        ARouter.init(this);
    }
}

(3)使用@Router注解定义一个路由页面;


// Router path至少需要两级
// "/xx/xxx"

@Router("/app/HomeActivity")
public HomeActivity extends AppcompactActivity {
   
   

    // 如果name与属性名称一致
    // 可以不指定@Autowired注解的name值
    @Autowired
    Int id;

    @Autowired(name="key2")
    String userName;

    @Autowired(name="test")
    Test test;

    @Override
    public void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);

        // ARouter inject注入
        // 注意:如果没有参数传递,这句可以不写
        // 注意:需要在Application中调用ARouter.getInstance.destory()释放资源
        ARouter.getInstance().inject(this);
    }
}

(4)Activity/Fragment路由跳转,传参数,获取返回值;

// a. 不传递参数跳转
ARouter.getInstance().build("/app/HomeActivity").navigation();

// b. 使用URL跳转
// 我们可以在清单文件中配置<data></data>标签指定uri的值
// <intent-filter>
//     <data
//        android:host="m.aliyun.com"
//        android:scheme="arouter"/>
//      ...
// </intent-filter>
Uri uri = getIntent().getData();
ARouter.getInstance().build(uri).navigation();

// c. 传递参数跳转
// 支持基本数据类型、Bundle、数组、列表、Serializable、Parcelable
// 跳转目标页面使用@Autowired注解获取
ARouter.getInstance().build("/app/HomeActivity")
            .withInt("id", 88888)
            .withString("name", "jiangdg")
            .withObject("test", new Test("Jack", "Rose"))
            .navigation();

// d. 跳转动画
ARouter.getInstance().build("/app/HomeActivity")
                     .withTransition(R.anim.in, R.anim.out)
                     .navigation();

// e. Fragment跳转
Fragment fragment = (Fragment)ARouter.getInstance().build("/app/TestFragment").navigation()

// f. 获取返回值
int requestCode = 1;
ARouter.getInstance().build("/app/HomeActivity").navigation(context, requestCode);

(5)ARouter拦截器实现

  • a. 使用@Interceptor注解定义拦截器,并实现IInterceptor接口实现;

// priority值表示拦截器优先级,越小优先级越大;
// name值表示拦截器的名称;

@Interceptor(priority=1, name="test")
public class UseIIterceptor implements IInterceptor {
   
   

    @Override
    public void init(Context context) {
   
   
        // 拦截器初始化
    }

    @Override
    public void process(Postcard postCard, InterceptorCallback callback) {
   
   
        // 拦截器处理逻辑
        // ...
        // 如:当跳转到"/app/HomeActivity"页面时,作相关的处理
        if (postCard.getPath().equal("/app/HomeActivity")) {
   
   
            Log.d(TAG, "I Get it");
        }
    }
}
  • b. 使拦截器生效,通过注册路由监听器实现;
ARouter.getInstance().build("/app/HomeActivity")
                     .navigation(context, new NavigationCallback() {
   
   
                        @Override
                        public void onFound(Postcard postcard) {
   
   
                            // 路由目标被发现时调用
                        }

                        @Override
                        public void onArrival(Postcard postcard) {
   
   
                            // 路由达到之后调用
                        }

                        @Override
                        public void onLost(Postcard postcard) {
   
   
                            // 路由被丢失时调用
                        }

                        @Override
                        public void onInterrupt(Postcard postcard) {
   
   
                            // 路由被拦截时调用
                        }
                     });

Postcard是一个包含路线图(roadmap)的容器,它允许让我们获取路径的组(group)以及全路径等信息。
 拦截器最终执行顺序: init->onFound->process->onLost(丢失)/onInterrupt(拦截)/onArrival(到达)

(6)自定义分组

 ARouter使用分组管理路由的跳转,防止应用在运行时一次性加载所有路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值