在項目開發過程當中,若是有用戶系統少不了登陸狀態的判斷,一般的一種實現方式是在baseActivity中獲取登錄狀態,當須要時進行if else判斷,這樣每次須要時就進行判斷一次很是的麻煩,如今咱們能夠用kotlin的擴展函數功能實現統一的登陸判斷及登陸後的自動跳轉。
首先說一下什麼是擴展函數,簡單來講,擴展函數就是讓一個已存在的類實現一些咱們自定義的功能,若是咱們對一個父類實現了擴展函數,那麼它的子類也會具備擴展功能,首先舉個例子:java
fun View.slideExit() {
if (translationY == 0f) animate().setInterpolator(AccelerateInterpolator()).setDuration(default_duration_short).translationY(height.toFloat())
}複製代碼
咱們在這裏給View增長了一個滑動退出功能,那麼全部集成View的類都具備了這個功能,好比TextView,咱們能夠直接調用ide
var tx=TextView(this)
tx.slideExit()複製代碼
下面來講所如何完成統一的登陸狀態判斷以及登陸後的自動跳轉,一般咱們的界面容器都是activit或者fragment,因此咱們就給這兩個類增長一個擴展函數功能,因爲代碼是同樣的
這裏就那Activity舉例,代碼以下函數
inline fun <reified T : Activity> Activity.checkLoginToStart(vararg params: Pair<String, Any>) {
var isLogin = AccountTool.isLogined(this)
if (isLogin) {
AnkoInternals.internalStartActivity(this, T::class.java, params)
} else {
var i = AnkoInternals.createIntent(this, T::class.java, params)
i.putExtra(LoginActivity.TARGET, "${T::class.java.`package`}.${T::class.java.simpleName}")
i.setClass(this, LoginActivity::class.java)
startActivity(i)
}
}複製代碼
注意擴展函數的寫法 是Activity.checkLoginToStart,若是是Fragment就是Fragment.checkLoginToStart
在這個函數須要一個Pair<String,Any>類型參數,用於傳遞參數,這是一個可選的,在函數內部先獲取了一下登錄狀態,若是是已登陸直接啓動目標Activity,若是是未登陸那麼咱們先經過AnkoInternals.createIntent把參數封裝起來,可是此時指定的activity是目標Activity即T::class.java,而咱們想要到達的是LoginActivity,因此經過setClass從新指定Activity,同時咱們把目標activity的絕對路徑也傳遞給LoginActivity,用於登陸後的自動跳轉。這樣咱們就成功跳轉到了LoginActivity,而且攜帶了目標activity的啓動參數。
在LoginActivity中假如咱們正確輸入了用戶名和密碼,成功登錄了,那麼在成功後的接口中咱們進行這樣的處理this
onsuccess{
var i = intent
var target = i.getStringExtra(TARGET)
if (target.isNullOrEmpty()) {
finish()
} else {
var reTarget = if (target.contains("package")) target.replace("package", "").trim() else target.trim()
i.setClassName(this@LoginActivity, reTarget)
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(i)
finish()
}
}複製代碼
好比onSuccess方法是咱們登陸成功後的回調方法,首先咱們獲取目標Activity的絕對路徑,這裏進行了一次判斷,若是咱們是直接啓動的登陸界面是沒有目標Activity的,因此直接finish,若是有那麼經過setClassName設置啓動的目標activity後直接經過這個intent啓動,注意此時這個intent中還攜帶了咱們目標activity中須要的參數,這樣登陸成功後就成功跳轉到了目標activity,參數也正常的傳遞了。到此整個流程分析完畢。spa
最後當咱們在activit中使用時,直接在Activit中調用code
checkLoginToStart<UserCenterActivity>()複製代碼
若是你須要給Activity傳遞參數 則接口
checkLoginToStart<UserCenterActivity>(KEY to VALUE)複製代碼
這樣一來少了一層邏輯判斷,代碼可讀性也更高。開發