什麼是EasyActivityResult
EasyActivityResult是開源基礎元件整合庫EasyAndroid中的基礎元件之一。其作用是:解決onActivityResult業務邏輯臃腫的問題
EasyAndroid作為一款整合元件庫,此庫中所整合的元件,均包含以下特點,你可以放心使用~~
- 精簡: 作為一款整合庫,我不希望有那種大元件,儘量控制好整合庫的大小。不要有冗餘程式碼
- 內聚: 儘量減少甚至避免單一元件對別的模組進行依賴。做到元件間獨立。
得益於編碼時的高內聚性
,若你只需要使用EasyActivityResult
. 那麼可以直接去copy EasyActivityResult原始碼檔案
到你的專案中,直接進行使用,也是沒問題的。
Activity資料回傳業務遇到的問題
在平時的開發中,我們需要頁面進行資料回傳時,都是通過startActivityForResult
啟動,然後在onActivityResult
方法處處理各自的業務邏輯。比如圖片拍照,比如地址選擇等。
這樣的做法,卻算不上優雅,而且隨著業務的持續迭代等原因,onActivityResult
方法也會容易失控,變得越來越臃腫,變得越來越難以維護。出現一堆的if-else if
語句塊。
而分析一下這種資料回傳業務的使用場景:需求應該是每個不同的startActivityForResult
的啟動分支。都對應於一個onActivityResult
的回傳判斷分支。它們是一一對應的關係。
也就是說,如果我們能方便的
在onActivityResult
處,將回傳資料正確的派發到對應的startActivityForResult
分支處,做到誰發起的
就交給誰自己處理
。這種業務場景就完美了。
而EasyActivityResult元件即是專門用來幹這種事的!
特性
- 接管
onActivityResult
方法,解耦資料回傳邏輯 - 在需要時,
自動建立
requestCode提供使用,免去每次都需要定義不重複的requestCode
步驟 - 防暴擊:兩次啟動間隔必須大於1秒。
用法
- 首先,在基類的
onActivityResult
方法中新增中轉方法:
class BaseActivity:Activity() {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
// 進行回傳資料過濾轉發
EasyActivityResult.dispatch(this, requestCode, resultCode, data)
}
}
複製程式碼
- 最後,使用EasyActivityResult.start()方法進行啟動即可:
EasyActivityResult.startActivity(
context,
intent,
{result:Int, data:Intent -> // 資料回撥介面
// TODO
// result:對應回傳的resultCode
// data: 對應回傳的intent資料
})
複製程式碼
使用方式就是這麼簡單!而且細心點的可以發現:**根本不用再配置requestCode了!**又省了一步操作。美滋滋~~
不用配置requestCode的原因是: 在元件內部。當你配置有資料回撥介面,那麼就會自動生成一個隨機的requestCode提供使用:
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("暴擊啟動測試:第三次啟動任務 接收返回資訊") })
}
複製程式碼
頁面效果展示: