RouterKtx.INSTANCE.startActivity(RouterPage.AROUTER_JB,new Pair<>(RouterPage.KEY,”key”),new Pair<>(RouterPage.DATA,list));
一、引入
Arouter使用方式参看文档中文版,正常引入即可,本篇介绍封装后的基本使用。kotlin引入时有些不同,文档比较简单,下面给出一个导入示例:
// 可以参考 module-kotlin 模块中的写法apply plugin: 'kotlin-kapt'kapt {arguments {arg("AROUTER_MODULE_NAME", project.getName())}}dependencies {compile 'com.alibaba:arouter-api:x.x.x'kapt 'com.alibaba:arouter-compiler:x.x.x'...}
Application里初始化:
class App: Application() {override fun onCreate() {super.onCreate()if (BuildConfig.DEBUG) { // 这两行必须写在init之前,否则这些配置在init过程中将无效ARouter.openLog(); // 打印日志ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)}ARouter.init(this); // 尽可能早,推荐在Application中初始化}override fun onTerminate() {super.onTerminate()ARouter.getInstance().destroy()}}
二、在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带参跳转
RouterKtx.INSTANCE.startActivity(RouterPage.AROUTER_JB,new Pair<>(RouterPage.KEY,"key"),new Pair<>(RouterPage.DATA,list));RouterKtx.INSTANCE.startActivityForResult(this,RouterPage.AROUTER_JB,23,new Pair<>(RouterPage.KEY,"key"));
使用扩展函数
扩展函数用法和上面一样,适合在kotlin中使用,不太适合在java中使用,示例: RouterKtxKt.startActivity(this,RouterPage.AROUTER_JB);
onActivityResult获取回传值
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);LogUtils.e(requestCode + "----onActivityResult:" + resultCode);LogUtils.e(data);if (data != null) {LogUtils.e(data.getStringExtra(RouterPage.KEY), "----onActivityResult:");}}
2.2 接收
使用原生的Intent获取
mKey = it.getStringExtra(RouterPage.KEY);mData = (ArrayList<RouterBean>) it.getSerializableExtra(RouterPage.DATA);
使用Arouter提供的方法
需要提前实现: ARouter.getInstance().inject(this);
每个参数的key要一一对应,就可以直接使用了:
//获取参数@Autowired(name = RouterPage.KEY)String mKey;@Autowired(name = RouterPage.DATA)ArrayList<RouterBean> mData;
2.3 回调优化
在回调方法里获取回传结果,不用再在onActivityResult中获取结果。适合用在跳转较多回调的情况。
原生优化无参跳转
ActivityHelper.Companion.init(this).startActivityForResult(ArouterBActivity.class, ((resultCode, data) -> {LogUtils.e(resultCode, "startActivityForResult");if (data != null) {LogUtils.e(data.getStringExtra(RouterPage.KEY), "startActivityForResult:");}}));
原生带参跳转
//带参跳转Intent intent = new Intent(this, ArouterJBActivity.class);intent.putExtra(RouterPage.KEY,"key");intent.putExtra(RouterPage.DATA,list);ActivityHelper.Companion.init(this).startActivityForResult(intent,((resultCode, data) -> {}));
Arouter跳转
//Arouter无参跳转ActivityHelper.Companion.init(this).startActivityForResult(RouterPage.AROUTER_JB, ((resultCode, data) -> {}));//Arouter使用bundler传值ActivityHelper.Companion.init(this).startActivityForResult(RouterPage.AROUTER_JB, bundle, ((resultCode, data) -> {}));//Arouter使用pair传值ActivityHelper.Companion.init(this).startActivityForResult(RouterPage.AROUTER_JB, ((resultCode, data) -> {}), new Pair<>(RouterPage.KEY, "key"), new Pair<>(RouterPage.DATA, list));});
三、在Kotlin中使用
3.1 跳转
一般的跳转使用
//示例demo
val bean = RouterBean(“alice”, 20)
val bean2 = RouterBean(“hh”, 2)
val list = arrayListOf
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中接收方式一样。
使用注解需要简单处理一下就可以是用来,示例如下。
// //获取传入参数@Autowired(name = RouterPage.KEY)@JvmFieldvar mKey: String? = null//传递一个对象// @Autowired(name = RouterPage.DATA)// @JvmField var mData: RouterBean? = null//传递一个list@Autowired(name = RouterPage.DATA)@JvmFieldvar 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中处理即可,方法如下:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)// LogUtils.e(data?.getStringExtra("key"),"key")LogUtils.e(data, "onActivityResult--data:")// LogUtils.e(resultCode,"onActivityResult--resultCode: $requestCode")if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {supportFragmentManager.fragments.forEach {it.onActivityResult(requestCode, resultCode, data)}}}
这样就可以在Fragment的onActivityResult方法获取回调,使用封装的回调也就可以触发回调。如果不使用路由,使用原生跳转,不加也可以获取到回调。
五、地址

1、help包下是针对java使用封装
- 2、helpk包下是针对kotlin使用封装
使用一个即可。
Github地址
由集成ARouter引发的一些思考
