ARouter入门总结

30 篇文章 0 订阅

ARouter

1.什么是ARouter?

ARouter是阿里开发的路由框架,主要用于模块化或者组建间实现独立,进行页面跳转。此外还能实现依赖注入功能。

2.ARouter的基本原理。

image-20200804104508561
  • 1.注册

B界面将类的信息,通过key-value的形式,注册到arouter中。

  • 2.查询

A界面将类信息与额外信息(传输参数、跳转动画等),通过key传递至arouter中,并查询对应需要跳转类的信息。

  • 3.结合

将A界面类信息、参数与B界面的类信息进行封装结合。

  • 4.跳转

将结合后的信息,使用startActivity实现跳转。

3.导入使用

1.添加依赖和配置

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

dependencies {
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    compile 'com.alibaba:arouter-api:x.x.x'
    annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
    ...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'

2.初始化SDK

if (isDebug()) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效
    ARouter.openLog();     // 打印日志
    ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化

4.基本使用。

  • 跳转无参界面

首先是在需要跳转的地方调用如下的代码。

// 1. 普通跳转
ARouter.getInstance().build("/test/activity").navigation();

跳转Activity中获取实例,然后根据路径build出postcard,最后调用navigation进行跳转。

navigation经过一系列的调用,最后会调用_navigation。可以看到最终会判断postcard类型,如果是activity的话最终会调用startActivity,因此本质上对于activity上来说 Arouter就是封装了startActivity而已。

private Object _navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
    final Context currentContext = null == context ? mContext : context;

    switch (postcard.getType()) {
        case ACTIVITY:
            // Build intent
            final Intent intent = new Intent(currentContext, postcard.getDestination());
            intent.putExtras(postcard.getExtras());

            // Set flags.
            int flags = postcard.getFlags();
            if (-1 != flags) {
                intent.setFlags(flags);
            } else if (!(currentContext instanceof Activity)) {    // Non activity, need less one flag.
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }

            // Set Actions
            String action = postcard.getAction();
            if (!TextUtils.isEmpty(action)) {
                intent.setAction(action);
            }

            // Navigation in main looper.
            runInMainThread(new Runnable() {
                @Override
                public void run() {
                    startActivity(requestCode, currentContext, intent, postcard, callback);
                }
            });

            break;
            …………

然后在被跳转的activity中添加注解@Route(path=“/xx/xx”)

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
    ...
}

注意此处的路径和上面的build时的路径必须一直,否则将会找不到对应的跳转界面。因此一般可以通过将所有的路径集成添加到一个接口中,如下所示。

public interface ActivityPath {
		String MAIN_ACTIVITY = "/app1/MainActivity";
  	String MAIN2_ACTIVITY = "/app1/Main2Activity";
}
  • 跳转带参界面

在需要跳转的地方调用以下代码。

ARouter.getInstance().build("/test/1")
            .withLong("key1", 666L)
            .withString("key3", "888")
            .withSerializable("key4", new Test("Jack", "Rose"))
            .navigation();

可以看到都是通过调用postcard(build返回的就是postcard对象)的withxxx的方法,往postcard内的Bundle以key-value的方式存值,和我们传统传递的方式差不多。

public Postcard withString(@Nullable String key, @Nullable String value) {
    mBundle.putString(key, value);
    return this;
}

最后调用navigation进行跳转。接收参数有三种方式,如注释所示。

@Route(path = "/test/1")
public class YourActivity extend Activity {
    //获取数据三种方式
    //1.通过Autowired注解 可以通过name=“key1”,将Bundle中“key1”存的值赋值给data
    //此外需要注意的是使用这个方法,要在onCreate中调用ARouter.getInstance().inject(this)
    @Autowired(name = "key1")
    public long data;
    //2.通过Autowired注解 变量直接取成key1,这样的效果等同与方法1
    //和方法1一样,需要在onCreate中调用ARouter.getInstance().inject(this);配合使用
    @Autowired()
    public long key1;
    //3.通过传统的Bundle获取
    public long data2=getIntent().getExtras().getLong("key1");
}
  • 传递object

首先先定义解析器,导入gson的依赖后直接复制即可。

@Route(path = "/service/json")
public class JsonSerializationService implements SerializationService {

  private Gson mGson;

  @Override
  public void init(Context context) {
    mGson = new Gson();

  }

  @Override
  public <T> T json2Object(String text, Class<T> clazz) {
    return mGson.fromJson(text, clazz);
  }

  @Override
  public String object2Json(Object instance) {
    return mGson.toJson(instance);
  }

  @Override
  public <T> T parseObject(String input, Type clazz) {
    return mGson.fromJson(input, clazz);
  }
}

创建测试的实体类

package com.example.myapplication.arouterTest;

import androidx.annotation.NonNull;

public class MyObject {
  private String name;
  private int age;

  public MyObject(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @NonNull @Override public String toString() {
    return "我叫"+name+",我今年"+age+"岁";
  }
}

然后发出跳转操作

ARouter.getInstance().build(ActivityPath.MAINACTIVITY3).withObject("object",new MyObject("张三",18)).navigation();

被跳转activity

SerializationService serializationService= ARouter.getInstance().navigation(SerializationService.class);
serializationService.init(this);
myObject=serializationService.parseObject(getIntent().getStringExtra("object"),MyObject.class);
textView.setText(myObject.toString());

最终显示成功。

  • url跳转

    界面配置

<activity android:name=".activity.SchameFilterActivity">
    <!-- Schame -->
    <intent-filter>
        <data
        android:host="m.aliyun.com"
        android:scheme="arouter"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>

​ 发送跳转操作

 Uri testUriMix = Uri.parse("arouter://m.aliyun.com/test/activity2");
                ARouter.getInstance().build(testUriMix)
                        .withString("key1", "value1")
                        .navigation();

​ 目标界面

@Route(path = "/test/activity2")
public class Test2Activity extends AppCompatActivity {
}

参考 https://www.jianshu.com/p/8098961bd30c

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值