Arouter使用

ARouter使用与原理

简单使用

1.添加依赖
在app下的build.gradle中添加如下代码

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

在app下的build.gradle中添加如下代码

implementation 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'

2.自定义一个Application并继承自ApplicationonCreate()方法中初始化Arouter

ARouter.init(this);

不要忘记在AndroidManifest.xml文件中加入自定义的Application

3.在Activity/Fragment类上面写上Route path注解
注意:这里的路径需要注意的是至少需要两级,/xx/xx

4.Activity/Fragment中将Arouter注入,在onCreate()中加入以下代码即可

ARouter.getInstance().inject(this);

5.接着在目标Activity/Fragment中声明注解,用来对应
注意:如果无法对应上则会有Toast提示:路径不匹配

@Route(path = "/app/MainActivity")

6.调用要打开的Activity/Fragment

Arouter.getInstance().build("/app/MainActivity").navigation();

完整代码如下:

@Route(path = "/app/MainActivity")
public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private ActivityMainBinding mBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        ARouter.getInstance().inject(this);
        initClick();
    }
    
    private void initClick() {
        mBinding.btnSecond.setOnClickListener(v ->
        		//打开SecondActivity
                ARouter.getInstance().build("/app/SecondActivity") .navigation());
    }
}

7.这个框架有注入和绑定那就必然会有解绑或者释放资源的API,这样做的目的是优化内存。

Arouter.getInstance().destroy();

onDestroy()中调用上面的代码即可释放资源

以上就是一次Arouter的基本使用,但是后期随着Activity增多,一个Activity可能会被多个Activity打开,上面的写法就会无法管理,所以我们进行一些封装

1.将注入代码放入到基类中,这样实现一个方法调用

public void injectARouter() {
    ARouter.getInstance().inject(this);
}

2.将 Route path进行封装

public class ActivityConsts {
    public static final String PATH = "path";

    public static final String ACTIVITY_URL_MAIN = "/app/MainActivity";

    public static final String ACTIVITY_URL_SECOND = "/app/SecondActivity";

    public static final String ACTIVITY_URL_LOGIN = "/app/LoginActivity";

    public static final String ACTIVITY_URL_THIRD = "/app/ThirdActivity";
}

3.封装完成后即可实现如下调用方式

@Route(path = ActivityConsts.ACTIVITY_URL_MAIN)
public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private ActivityMainBinding mBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        ARouter.getInstance().inject(this);
        initClick();
    }

    private void initClick() {
        mBinding.btnSecond.setOnClickListener(v ->
                ARouter.getInstance().build(ActivityConsts.ACTIVITY_URL_SECOND)
                        .navigation());
        mBinding.btnThird.setOnClickListener(v ->
                ARouter.getInstance()
                        .build(ActivityConsts.ACTIVITY_URL_THIRD)
                        .navigation());
    }
}
传递参数

Arouter传递对象的时候,首先该对象需要Parcelable或者Serializable序列化,Parcelable写起来较为麻烦,但是Android Studio有一些插件帮我们自动生成Parcelable序列化了

Arouter可传递的参数类型还是够我们日常使用的

如图所示
可以传递参数,那就可以接收参数,@Autoired()便是接收参数的方法,使用时有两个点要注意。

  1. 括号中最好注明要接受的参数的key值,如@Autoired(name = "age"),否则会出现null或者无法接受到你传递的参数;
  2. 接受参数的变量声明时不要加修饰符,否则会出现无法编译的情况。
@Autowired(name = "name")
String mName;

@Autowired(name = "age")
int mAge;

@Autowired(name = "hero")
boolean isHero;

简单举个例子:
传递参数

 mBinding.btnThird.setOnClickListener(v ->
                ARouter.getInstance()
                        .build(ActivityConsts.ACTIVITY_URL_THIRD)
                        .withString("name", "Tony")
                        .withInt("age", 56)
                        .withBoolean("hero", true)
                        .navigation(this, new CustomNavigationCallback()));

接收参数

@Route(path = ActivityConsts.ACTIVITY_URL_THIRD, extras = ActivityExtras.EXTRA_LOGIN)
public class ThirdActivity extends AppCompatActivity {
    private static final String TAG = ThirdActivity.class.getSimpleName();
    
    @Autowired(name = "name")
    String mName;

    @Autowired(name = "age")
    int mAge;

    @Autowired(name = "hero")
    boolean isHero;
    
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        Log.i(TAG, mName + ",  age:" + mAge + ", isHero:" + isHero);
    }

在这里插入图片描述

界面跳转动画
 mBinding.btnThird.setOnClickListener(v ->
                ARouter.getInstance()
                        .build(ActivityConsts.ACTIVITY_URL_THIRD)
   						.withTransition(R.anim.xxxxxxx)		//传入动画即可
                        .navigation());
使用URI进行跳转

在这里插入图片描述

如何实现startActivityForResult()呢?

1.在调用Arouter进行Activity进行跳转时,在navigation()中加入requestCode即可。

2.调用setRsult(requestCode)

3.在onActivityResult()中根据响应的requestCode获取参数
在这里插入图片描述
在这里插入图片描述

让人兴奋的功能——拦截器

有些App进入时不需要登录,只有在需要的时候才会登录,这个时候就需要逐一判断,涉及页面较少时也没什么的,但是多了就会影响很麻烦,Arouter很好地解决了这个问题,只需要判断一次,后期可直接进行配置。

Arouter的拦截器是通过实现IInterceptor接口,重写init()process()方法去完成拦截器内部操作的。

1.首先定义一个拦截器
定义UseIInterceptor实现IInterceptor及其方法
在这里插入图片描述
2.定义一个被拦截后的处理类
这一步的目的是我们可以在这类面添加自己需要的操作,不写也行可以直接在拦截时调用NavigationCallback,但是会比较麻烦。
在这里插入图片描述
3.这一步就是使用了
在需要拦截的Activity中加入定义好的拦截常量
extras = ActivityExtras.EXTRA_LOGIN
在这里插入图片描述
在触发事件的里面加入刚才定义的CustomNavigationCallback即可
在这里插入图片描述
这时候可能会有疑问UseIInterceptor没有在任何地方调用,怎么会产生拦截呢,卖个关子,讲原理的时候再解开这个疑问。

上面的代码中在UseIInterceptor的顶部定义了一个@Interceptor(priority = 1),这个是拦截器的优先级,此处有两个点需要注意一下

1.priority的数值越小优先级越高,越先执行,这根四大组件的广播是相反的。

2.不可以同时定义两个一样优先级的拦截器,这样会导致项目无法正常编译,而且这也没必要。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值