EasyActivityResult是开源基础组件集成库EasyAndroid中的基础组件之一。其做用是:解决onActivityResult业务逻辑臃肿的问题java
EasyAndroid做为一款集成组件库,此库中所集成的组件,均包含如下特色,你能够放心使用~~android
得益于编码时的高内聚性
,若你只须要使用EasyActivityResult
. 那么能够直接去copy EasyActivityResult源码文件
到你的项目中,直接进行使用,也是没问题的。git
在平时的开发中,咱们须要页面进行数据回传时,都是经过startActivityForResult
启动,而后在onActivityResult
方法到处理各自的业务逻辑。好比图片拍照,好比地址选择等。github
这样的作法,却算不上优雅,并且随着业务的持续迭代等缘由,onActivityResult
方法也会容易失控,变得愈来愈臃肿,变得愈来愈难以维护。出现一堆的if-else if
语句块。bash
而分析一下这种数据回传业务的使用场景:需求应该是每一个不一样的startActivityForResult
的启动分支。都对应于一个onActivityResult
的回传判断分支。它们是一一对应的关系。ide
也就是说,若是咱们能方便的
在onActivityResult
处,将回传数据正确的派发到对应的startActivityForResult
分支处,作到谁发起的
就交给谁本身处理
。这种业务场景就完美了。测试
而EasyActivityResult组件便是专门用来干这种事的!this
onActivityResult
方法,解耦数据回传逻辑自动建立
requestCode提供使用,免去每次都须要定义不重复的requestCode
步骤onActivityResult
方法中添加中转方法:class BaseActivity:Activity() {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
// 进行回传数据过滤转发
EasyActivityResult.dispatch(this, requestCode, resultCode, data)
}
}
复制代码
EasyActivityResult.startActivity(
context,
intent,
{result:Int, data:Intent -> // 数据回调接口
// TODO
// result:对应回传的resultCode
// data: 对应回传的intent数据
})
复制代码
使用方式就是这么简单!并且细心点的能够发现:**根本不用再配置requestCode了!**又省了一步操做。美滋滋~~编码
不用配置requestCode的缘由是: 在组件内部。当你配置有数据回调接口,那么就会自动生成一个随机的requestCode提供使用:spa
if (context !is Activity || callback == null) {
context.startActivity(intent)
} else {
val requestCode = codeGenerator.nextInt(0x0000FFFF)
...
}
复制代码
并且,因为咱们也接管了启动入口。因此也能很方便的进行防暴击过滤:
如下方的模拟暴击点击为例:
@OnClick(R.id.violentStart)
fun violentStart() {
// 暴击启动测试:同时被调用启动屡次,应只有第一次启动成功
EasyActivityResult.startActivity(this,
Intent(this, EasyToastActivity::class.java),
{_, _ -> EasyToast.DEFAULT.show("暴击启动测试:第一次启动任务 接收返回信息") })
EasyActivityResult.startActivity(this,
Intent(this, EasyToastActivity::class.java),
{_, _ -> EasyToast.DEFAULT.show("暴击启动测试:第二次启动任务 接收返回信息") })
EasyActivityResult.startActivity(this,
Intent(this, EasyToastActivity::class.java),
{_, _ -> EasyToast.DEFAULT.show("暴击启动测试:第三次启动任务 接收返回信息") })
}
复制代码
页面效果展现: