ARouter的使用

简介:
ARouter是阿里Android技术团队开源的一款路由框架,可以使我们在进行模块化开发时提供更好更方便的页面跳转。

阿里巴巴开源的路由gitHub地址

本文介绍一下它的基本使用以及会出现的问题:


简单页面跳转
  • 同一模块下的活动的跳转
    (1)首先我们要在bulid.gradle中添加依赖:
android {
   ···
    defaultConfig {
       ···
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME:project.getName()]
            }
        }
    }

   ···
dependencies {
   //这里的版本根据github上面lastest version为准
    implementation 'com.alibaba:arouter-api:1.5.0'  
 
     //这里的版本根据github上面lastest version为准
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'   
}

(2)在Application中进行ARouter的初始化,释放资源一般也在Application的销毁方法写

public class HomeApplication extends Application {
    //ARouter调试开关
    private boolean isDebug = true;
    @Override
    public void onCreate() {
        super.onCreate();
        if (isDebug) {
            //以下两种属性必须在初始化之前开启
            //打印日志
            ARouter.openLog();
            //开启调试模式(如果在InstantRun模式下进行,必须开启调试模式)
            // 线上版本需要关闭,否则会有安全风险
            ARouter.openDebug();
        }
        ARouter.init(this);
    }
}

(3)在AndroidManifest中配置自定义的Application
在这里插入图片描述
(4)在同一模块下建立两个活动,并注册
在这里插入图片描述

@Route(path = "/app/SecondActivity")
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}

在这里插入图片描述


跳转的页面的Route path 注解一定与在跳转页面之前ARouter.getInstance().bulid函数参数一致

出现 ARouter::Compiler >>> No module name, for more information, look at gradle log.的错误原因:

全部module包括module依赖的module,在每个module的 build.gradle中加上依赖的代码

在添加依赖时一定要 arguments = [AROUTER_MODULE_NAME:project.getName()] AROUTER_MODULE_NAME 不是 moduleName

出现there is no route matched的错误原因(个人在项目中使用了java的配置,用kotlin写的项目,浪费了很多时间)所以在这里给大家看看java和kotlin两种配置,希望大家要犯这种错误:

  • Java配置
    在这里插入图片描述
  • kotlin配置
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {

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

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation project(":base")
   //组件化项目一般在base类中引入依赖
   // implementation 'com.alibaba:arouter-api:1.3.1'
    kapt 'com.alibaba:arouter-compiler:1.1.4'
}

  • 不同模块下的活动的跳转和上面的方式是一样的,但有几条注意事项要注意一下
    (1) 不同模块下活动的跳转,必须有依赖关系,比如说Module A 中想要跳转到Module B的页面,Module A 必须依赖Module B
    (2) 不同模块的注解名的一级包名不可以相同

带参数的页面跳转
ARouter.getInstance().build("/show/second").navigation(this,123)

在接受数据的页面重写onActivityResult()方法

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when(requestCode) {
            123 -> if(resultCode == 1)
                if (data != null) {
                    Log.e("MAIN","接收到了 ${data.getStringExtra("name")}")
                }
            else -> Log.e("MAIN","无")
        }
    }

在传递数据的页面设置如下(设置了返回码以及需要传递的数据):

		val intent = Intent()
        intent.putExtra("name","zyy")
        setResult(1,intent)

onActivityResult()方法是活动销毁之后调用的方法,我们可以在传递参数的页面调用finish()
如果我们通过返回键来调用,则需要重写onBackPressed()方法


查看回调
ARouter.getInstance().build("/show/second").navigation(this,object : NavCallback() {
                override fun onArrival(postcard: Postcard?) {
                    //TODO("Not yet implemented")
                    Log.e("SHOW","跳转成功")
                }

                override fun onFound(postcard: Postcard?) {
                    super.onFound(postcard)
                    Log.e("SHOW","找到了")
                }

                override fun onInterrupt(postcard: Postcard?) {
                    super.onInterrupt(postcard)
                    Log.e("SHOW","被拦截了")
                }

                override fun onLost(postcard: Postcard?) {
                    super.onLost(postcard)
                    Log.e("SHOW","找不到了")
                }
            })

拦截器
@Interceptor(priority = 1)
class MyIIntercepter() : IInterceptor {
    override fun init(context: Context?) {
//        TODO("Not yet implemented")

    }

    override fun process(postcard: Postcard, callback: InterceptorCallback?) {
//        TODO("Not yet implemented")
        if (postcard.path.equals("/show/second")) {
            Log.e("MAIN","成功拦截")
        }
    }
}

自定义拦截器需要实现IInterceptor接口,并且添加@Interceptor的注解,其中priority为拦截器的优先级,值越小,优先级越高;然后实现pocess()和init()方法。

优先级不能相同,否则编译会出现问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android ARouter 是一个用于实现组件化、模块化开发的路由框架,它提供了一种简单的方式来实现不同组件之间的跳转和通信。 使用 ARouter 的步骤如下: 1. 在项目的 build.gradle 文件中添加依赖: ```groovy implementation 'com.alibaba:arouter-api:x.x.x' annotationProcessor 'com.alibaba:arouter-compiler:x.x.x' ``` 请将 `x.x.x` 替换为最新的版本号。 2. 在需要使用 ARouter 的模块中,创建一个类似于 Application 的类,并在其 `onCreate()` 方法中进行 ARouter 的初始化: ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { ARouter.openLog(); ARouter.openDebug(); } ARouter.init(this); } } ``` 3. 在需要跳转到的目标页面中,使用 `@Route` 注解进行标记,以便 ARouter 进行识别: ```java @Route(path = "/path/to/target") public class TargetActivity extends AppCompatActivity { // ... } ``` 4. 在需要跳转的地方,通过调用 `ARouter.getInstance().build("/path/to/target").navigation()` 来实现页面跳转: ```java ARouter.getInstance().build("/path/to/target").navigation(); ``` 5. 如果需要传递参数,可以使用 `withXxx` 方法来添加参数: ```java ARouter.getInstance() .build("/path/to/target") .withString("key", "value") .navigation(); ``` 通过以上步骤,你就可以在 Android 项目中使用 ARouter 进行页面跳转和参数传递了。当然,ARouter 还提供了其他功能,比如拦截器、URI 跳转等,你可以根据具体需求进行使用。希望对你有所帮助!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值