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("暴擊啓動測試:第三次啓動任務 接收返回信息") })
}
複製代碼
頁面效果展現: