ARouter基本使用

一.介绍

ARouter可以通过url进行索引跳转,比系统原生的跳转(需要依赖类或AndroidManifest)更灵活 可以解耦,便与团队协作开发,常用于组件化中

二.配置

1.组件化BaseModule的build.gradle中添加

implementation 'com.alibaba:arouter-api:1.3.0'

2.在跳转的目标组件的build.gradle中,增加以下配置:

android {
    defaultConfig {
    ...
    //用于ARouter跳转找到路径(每一个目标Module都需要加此配置)
    javaCompileOptions {
        annotationProcessorOptions {
        arguments = [ moduleName : project.getName() ]
        }
    }
    }
}
dependencies {
    annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
    ...
}

注:com.alibaba:arouter-api:1.3.0和com.alibaba:arouter-compiler版本差异过多可能会报错编译不过

3.初始化

在Application中初始化:

if (BuildConfig.DEBUG) {
    ARouter.openLog();//打开日志
    ARouter.openDebug();//打开调式模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(this);

4.在跳转的Activity的类名上中添加path:

@Route(path = "/opensourceframeworkandkotlindemo/arouter")
public class ARouterActivity extends AppCompatActivity {

上面定义的path即跳转时传入的path,即可跳转到对应界面

5.跳转

(1)普通跳转
无参数跳转

ARouter.getInstance()
        .build("/opensourceframeworkandkotlindemo/arouter")
        .navigation();

(2)有参数跳转

ARouter.getInstance()
       .build("/opensourceframeworkandkotlindemo/arouter")
       .withString("params", "123")
       .navigation();

Activity跳转的时候ARouter将参数封装成bundle用intent的传递,Fragment会setArgument

然后在目标界面使用,使用Autowired注解

@Route(path = "/opensourceframeworkandkotlindemo/arouter")
   public class ARouterActivity extends AppCompatActivity {
       @Autowired(name = "params")
       String params;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_arouter);
           Log.d("ARouterActivity", "params: " + params);
       }
   }

(3)跳转带回调,可以在回调中查看调用状态

ARouter.getInstance()
    .build("/opensourceframeworkandkotlindemo/arouter")
    .withString("params", "123")
    .navigation(this, new NavCallback() {
        @Override
        public void onFound(Postcard postcard) {
            Log.d(TAG, "找到了");
        }

        @Override
        public void onLost(Postcard postcard) {
            Log.d(TAG, "没找到");
        }

        @Override
        public void onArrival(Postcard postcard) {
            Log.d(TAG, "跳转成功");
        }

        @Override
        public void onInterrupt(Postcard postcard) {
            Log.d(TAG, "被拦截了");
        }
    });

(4)ARouter如何实现类似startActivityForResult()
在navigation中将requestCode传进去即可,在onActivityResult中处理

ARouter.getInstance()
           .build("/opensourceframeworkandkotlindemo/arouter")
           .navigation(this, 100);

6.拦截器

常用于界面跳转前拦截,比如跳转登录前判断是否可以登录的拦截
1.拦截器的使用方式
自定义拦截器需要实现IInterceptor接口,并且添加@Interceptor的注解,其中priority为拦截器的优先级,值越小,优先级越高;然后实现pocess()和init()方法。 例如:

/**
 * @author garycong
 * @date 2019/7/19.
 * description:
 * 拦截器,可以用于拦截跳转
 * 自定义拦截器需要实现IInterceptor接口,并且添加@Interceptor的注解,其中priority为拦截器的优先级,
 * 值越小,优先级越高;然后实现pocess()和init()方法。
 */
@Interceptor(priority = 1)
public class TestInterceptor implements IInterceptor{
    private Context mContext;
    public static boolean isIntercept;
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
    //可以通过变量控制是否需要拦截
        if (isIntercept) {
            //拦截
            if (postcard.getPath().equals("/opensourceframeworkandkotlindemo/arouter")) {//拦截指定路径
                Log.d("TestInterceptor", "成功拦截ARouterActivity");
            }
        } else {
            //不拦截,继续调起
            callback.onContinue(postcard);
        }
    }

    @Override
    public void init(Context context) {
        mContext = context;
    }
}

注:定义多个拦截器的时候,priority的值不能定义一样的,只要其中两个拦截器的优先值一样,编译时会报错

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值