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获取回传值
@Override
protected 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)
@JvmField
var mKey: String? = null
//传递一个对象
// @Autowired(name = RouterPage.DATA)
// @JvmField var mData: RouterBean? = null
//传递一个list
@Autowired(name = RouterPage.DATA)
@JvmField
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中处理即可,方法如下:
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引发的一些思考