RouterKtx.INSTANCE.startActivity(RouterPage.AROUTER_JB,new Pair<>(RouterPage.KEY,”key”),new Pair<>(RouterPage.DATA,list));

一、引入

Arouter使用方式参看文档中文版,正常引入即可,本篇介绍封装后的基本使用。kotlin引入时有些不同,文档比较简单,下面给出一个导入示例:

  1. // 可以参考 module-kotlin 模块中的写法
  2. apply plugin: 'kotlin-kapt'
  3. kapt {
  4. arguments {
  5. arg("AROUTER_MODULE_NAME", project.getName())
  6. }
  7. }
  8. dependencies {
  9. compile 'com.alibaba:arouter-api:x.x.x'
  10. kapt 'com.alibaba:arouter-compiler:x.x.x'
  11. ...
  12. }

Application里初始化:

  1. class App: Application() {
  2. override fun onCreate() {
  3. super.onCreate()
  4. if (BuildConfig.DEBUG) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
  5. ARouter.openLog(); // 打印日志
  6. ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
  7. }
  8. ARouter.init(this); // 尽可能早,推荐在Application中初始化
  9. }
  10. override fun onTerminate() {
  11. super.onTerminate()
  12. ARouter.getInstance().destroy()
  13. }
  14. }

二、在java中使用

2.1 跳转

无参跳转

RouterKtx.INSTANCE.startActivity(RouterPage.AROUTER_JB); RouterKtx.INSTANCE.startActivityForResult(this,RouterPage.AROUTER_JB,9);

带参跳转,Bundle

Bundle bundle = new Bundle(); bundle.putString(RouterPage.KEY,”key”); BundleKtx.INSTANCE.putList(bundle,RouterPage.DATA,list);


RouterKtx.INSTANCE.startActivity(RouterPage.AROUTER_JB,bundle); RouterKtx.INSTANCE.startActivityForResult(this,RouterPage.AROUTER_JB,bundle,22);

使用Pair带参跳转

  1. RouterKtx.INSTANCE.startActivity(RouterPage.AROUTER_JB,new Pair<>(RouterPage.KEY,"key"),new Pair<>(RouterPage.DATA,list));
  2. RouterKtx.INSTANCE.startActivityForResult(this,RouterPage.AROUTER_JB,23,new Pair<>(RouterPage.KEY,"key"));

使用扩展函数

扩展函数用法和上面一样,适合在kotlin中使用,不太适合在java中使用,示例: RouterKtxKt.startActivity(this,RouterPage.AROUTER_JB);

onActivityResult获取回传值

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. LogUtils.e(requestCode + "----onActivityResult:" + resultCode);
  5. LogUtils.e(data);
  6. if (data != null) {
  7. LogUtils.e(data.getStringExtra(RouterPage.KEY), "----onActivityResult:");
  8. }
  9. }

2.2 接收

使用原生的Intent获取

  1. mKey = it.getStringExtra(RouterPage.KEY);
  2. mData = (ArrayList<RouterBean>) it.getSerializableExtra(RouterPage.DATA);

使用Arouter提供的方法

需要提前实现: ARouter.getInstance().inject(this);
每个参数的key要一一对应,就可以直接使用了:

  1. //获取参数
  2. @Autowired(name = RouterPage.KEY)
  3. String mKey;
  4. @Autowired(name = RouterPage.DATA)
  5. ArrayList<RouterBean> mData;

2.3 回调优化

在回调方法里获取回传结果,不用再在onActivityResult中获取结果。适合用在跳转较多回调的情况。

原生优化无参跳转

  1. ActivityHelper.Companion.init(this)
  2. .startActivityForResult(ArouterBActivity.class, ((resultCode, data) -> {
  3. LogUtils.e(resultCode, "startActivityForResult");
  4. if (data != null) {
  5. LogUtils.e(data.getStringExtra(RouterPage.KEY), "startActivityForResult:");
  6. }
  7. }));

原生带参跳转

  1. //带参跳转
  2. Intent intent = new Intent(this, ArouterJBActivity.class);
  3. intent.putExtra(RouterPage.KEY,"key");
  4. intent.putExtra(RouterPage.DATA,list);
  5. ActivityHelper.Companion.init(this)
  6. .startActivityForResult(intent,((resultCode, data) -> {
  7. }));

Arouter跳转

  1. //Arouter无参跳转
  2. ActivityHelper.Companion.init(this)
  3. .startActivityForResult(RouterPage.AROUTER_JB, ((resultCode, data) -> {
  4. }));
  5. //Arouter使用bundler传值
  6. ActivityHelper.Companion.init(this)
  7. .startActivityForResult(RouterPage.AROUTER_JB, bundle, ((resultCode, data) -> {
  8. }));
  9. //Arouter使用pair传值
  10. ActivityHelper.Companion.init(this)
  11. .startActivityForResult(RouterPage.AROUTER_JB, ((resultCode, data) -> {
  12. }), new Pair<>(RouterPage.KEY, "key"), new Pair<>(RouterPage.DATA, list));
  13. });

三、在Kotlin中使用

3.1 跳转

一般的跳转使用

//示例demo
val bean = RouterBean(“alice”, 20)
val bean2 = RouterBean(“hh”, 2)
val list = arrayListOf(bean, bean2)
val bundle = Bundle()
bundle.putString(RouterPage.KEY,”hai”)
BundleKtx.putList(bundle,RouterPage.DATA,list)
//无参跳转
RouterKtx.startActivity(RouterPage.AROUTERB)
RouterKtx.startActivityForResult(this,RouterPage.AROUTER_B,9)
_startActivity
(RouterPage.AROUTERB) //扩展函数
//带参bundle跳转
RouterKtx.startActivity(RouterPage.AROUTER_B,bundle)
RouterKtx.startActivityForResult(this,RouterPage.AROUTER_B,bundle,99)
_startActivity
(RouterPage.AROUTERB,bundle) //扩展函数
//带参pair跳转
RouterKtx.startActivity(RouterPage.AROUTER_B,RouterPage.KEY _to
“hai”, RouterPage.DATA to _list)
RouterKtx.startActivityForResult(this,RouterPage.AROUTER_B,88,RouterPage.KEY _to
“hai”, RouterPage.DATA to _list)
_startActivity
(RouterPage.AROUTERB,RouterPage.KEY _to “hai”, RouterPage.DATA _to _list) //扩展函数
对于startActivityForResult,回调结果在onActivityResult中获取。

3.2 回调优化

原生跳转

//原生跳转优化
ActivityHelperK.init(this)
.startActivityForResult(ArouterBActivity::class.java) { resultCode, data ->
}
//扩展函数
startActivityForResult(ArouterBActivity::class.java) { resultCode, data ->
}
//原生带参
val intent = Intent(this, ArouterBActivity::class.java)
intent.putExtra(RouterPage.KEY, “hai”)
intent.putExtra(RouterPage.DATA, list)
ActivityHelperK.init(this)
.startActivityForResult(intent) { resultCode, data ->
}
//扩展函数
startActivityForResult(intent) { resultCode, data ->
}

Arouter跳转

//路由跳转
ActivityHelperK.init(this)
.startActivityForResult(RouterPage.AROUTER_B) { resultCode, data ->
}
//扩展函数
startActivityForResult(RouterPage.AROUTER_B) { resultCode, data ->
}
//路由bundle传值跳转
ActivityHelperK.init(this)
.startActivityForResult(RouterPage.AROUTER_B, bundle) { resultCode, data ->
}
//扩展函数
startActivityForResult(RouterPage.AROUTER_B, bundle) { resultCode, data ->
}
//路由pair传值跳转
ActivityHelperK.init(this)
.startActivityForResult(RouterPage.AROUTER_B, { resultCode, data ->
}, RouterPage.KEY to “hai”, RouterPage.DATA to list)
//扩展函数
startActivityForResult(RouterPage.AROUTER_B, { resultCode, data ->
}, RouterPage.KEY to “hai”, RouterPage.DATA to list)

3.3 接收数据

  • 使用intent接收和在java中接收方式一样。
  • 使用注解需要简单处理一下就可以是用来,示例如下。

    1. // //获取传入参数
    2. @Autowired(name = RouterPage.KEY)
    3. @JvmField
    4. var mKey: String? = null
    5. //传递一个对象
    6. // @Autowired(name = RouterPage.DATA)
    7. // @JvmField var mData: RouterBean? = null
    8. //传递一个list
    9. @Autowired(name = RouterPage.DATA)
    10. @JvmField
    11. var mData: ArrayList<RouterPage>? = null

    四、Fragment相关

    使用方法

    在Fragment中用法和在Activity中用法基本一样。示例如下:
    //示例demo
    val bean = RouterBean(“alice”, 20)
    val bean2 = RouterBean(“hh”, 2)
    val list = arrayListOf(bean, bean2)
    val bundle = Bundle()
    bundle.putString(RouterPage.KEY, “hai”)
    BundleKtx.putList(bundle, RouterPage.DATA, list)
    //无参跳转
    RouterKtx.startActivity(RouterPage.AROUTERB)
    RouterKtx.startActivityForResult(mActivity, RouterPage.AROUTER_B, 9)
    _startActivity
    (RouterPage.AROUTERB) //扩展函数
    //带参bundle跳转
    RouterKtx.startActivity(RouterPage.AROUTER_B, bundle)
    RouterKtx.startActivityForResult(mActivity, RouterPage.AROUTER_B, bundle, 99)
    _startActivity
    (RouterPage.AROUTERB, bundle) //扩展函数
    //带参pair跳转
    RouterKtx.startActivity(
    RouterPage.AROUTER_B,
    RouterPage.KEY _to
    “hai”,
    RouterPage.DATA to _list
    )
    RouterKtx.startActivityForResult(
    mActivity,
    RouterPage.AROUTER_B,
    88,
    RouterPage.KEY _to
    “hai”,
    RouterPage.DATA to _list
    )
    _startActivity
    (
    RouterPage.AROUTERB,
    RouterPage.KEY _to
    “hai”,
    RouterPage.DATA to _list
    ) //扩展函数
    //回调跳转优化
    //原生跳转优化
    ActivityHelperK.init(mActivity)
    .startActivityForResult(ArouterBActivity::class._java
    ) { resultCode, data ->

    }
    //扩展函数
    startActivityForResult(ArouterBActivity::class.java) { resultCode, data ->

    }
    //原生带参
    val intent = Intent(mActivity, ArouterBActivity::class.java)
    intent.putExtra(RouterPage.KEY, “hai”)
    intent.putExtra(RouterPage.DATA, list)
    ActivityHelperK.init(mActivity)
    .startActivityForResult(intent) { resultCode, data ->

    }
    //扩展函数
    startActivityForResult(intent) { resultCode, data ->

    }
    //路由跳转
    ActivityHelperK.init(mActivity)
    .startActivityForResult(RouterPage.AROUTERB) { resultCode, data ->

    }
    //扩展函数
    _startActivityForResult
    (RouterPage.AROUTERB) { resultCode, data ->

    }
    //路由bundle传值跳转
    ActivityHelperK.init(mActivity)
    .startActivityForResult(RouterPage.AROUTER_B, bundle) { resultCode, data ->

    }
    //扩展函数
    _startActivityForResult
    (RouterPage.AROUTERB, bundle) { resultCode, data ->

    }
    //路由pair传值跳转
    ActivityHelperK.init(mActivity)
    .startActivityForResult(RouterPage.AROUTER_B, { resultCode, data ->
    }**, RouterPage.KEY _to
    “hai”, RouterPage.DATA to _list)
    //扩展函数
    _startActivityForResult
    (RouterPage.AROUTERB, { resultCode, data ->
    }**, RouterPage.KEY _to
    “hai”, RouterPage.DATA _to _list)

    重点

    使用Arouter跳转,在Fragment中的onActivityResult无法获取到回调,回调结果在Activity的onActivityResult方法中,通过查找资料,有两种解决方法。

  • 1、通过对Fragment相关的路由重写解决,没有验证过,文档地址FragmentARouter

  • 2、在Activity的onActivityResult中处理即可,方法如下:

    1. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    2. super.onActivityResult(requestCode, resultCode, data)
    3. // LogUtils.e(data?.getStringExtra("key"),"key")
    4. LogUtils.e(data, "onActivityResult--data:")
    5. // LogUtils.e(resultCode,"onActivityResult--resultCode: $requestCode")
    6. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    7. supportFragmentManager.fragments.forEach {
    8. it.onActivityResult(requestCode, resultCode, data)
    9. }
    10. }
    11. }

    这样就可以在Fragment的onActivityResult方法获取回调,使用封装的回调也就可以触发回调。如果不使用路由,使用原生跳转,不加也可以获取到回调。

    五、地址

    image.png

  • 1、help包下是针对java使用封装

  • 2、helpk包下是针对kotlin使用封装

使用一个即可。
Github地址
由集成ARouter引发的一些思考