Kotlin-優(yōu)雅的完成登錄判斷及自動(dòng)跳轉(zhuǎn)功能

在項(xiàng)目開發(fā)過程中,如果有用戶系統(tǒng)少不了登錄狀態(tài)的判斷,通常的一種實(shí)現(xiàn)方式是在baseActivity中獲取登陸狀態(tài),當(dāng)需要時(shí)進(jìn)行if else判斷,這樣每次需要時(shí)就進(jìn)行判斷一次非常的麻煩,現(xiàn)在我們可以用kotlin的擴(kuò)展函數(shù)功能實(shí)現(xiàn)統(tǒng)一的登錄判斷及登錄后的自動(dòng)跳轉(zhuǎn)。
首先說一下什么是擴(kuò)展函數(shù),簡(jiǎn)單來(lái)說,擴(kuò)展函數(shù)就是讓一個(gè)已存在的類實(shí)現(xiàn)一些我們自定義的功能,如果我們對(duì)一個(gè)父類實(shí)現(xiàn)了擴(kuò)展函數(shù),那么它的子類也會(huì)具有擴(kuò)展功能,首先舉個(gè)例子:

fun View.slideExit() {
    if (translationY == 0f) animate().setInterpolator(AccelerateInterpolator()).setDuration(default_duration_short).translationY(height.toFloat())
}

我們?cè)谶@里給View增加了一個(gè)滑動(dòng)退出功能,那么所有集成View的類都具有了這個(gè)功能,比如TextView,我們可以直接調(diào)用

var tx=TextView(this)
tx.slideExit()

下面來(lái)說所如何完成統(tǒng)一的登錄狀態(tài)判斷以及登錄后的自動(dòng)跳轉(zhuǎn),通常我們的界面容器都是activit或者fragment,所以我們就給這兩個(gè)類增加一個(gè)擴(kuò)展函數(shù)功能,由于代碼是一樣的
這里就那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)
    }
}

注意擴(kuò)展函數(shù)的寫法 是Activity.checkLoginToStart,如果是Fragment就是Fragment.checkLoginToStart
在這個(gè)函數(shù)需要一個(gè)Pair<String,Any>類型參數(shù),用于傳遞參數(shù),這是一個(gè)可選的,在函數(shù)內(nèi)部先獲取了一下登陸狀態(tài),如果是已登錄直接啟動(dòng)目標(biāo)Activity,如果是未登錄那么我們先通過AnkoInternals.createIntent把參數(shù)封裝起來(lái),但是此時(shí)指定的activity是目標(biāo)Activity即T::class.java,而我們想要到達(dá)的是LoginActivity,所以通過setClass重新指定Activity,同時(shí)我們把目標(biāo)activity的絕對(duì)路徑也傳遞給LoginActivity,用于登錄后的自動(dòng)跳轉(zhuǎn)。這樣我們就成功跳轉(zhuǎn)到了LoginActivity,并且攜帶了目標(biāo)activity的啟動(dòng)參數(shù)。
在LoginActivity中假如我們正確輸入了用戶名和密碼,成功登陸了,那么在成功后的接口中我們進(jìn)行這樣的處理

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方法是我們登錄成功后的回調(diào)方法,首先我們獲取目標(biāo)Activity的絕對(duì)路徑,這里進(jìn)行了一次判斷,如果我們是直接啟動(dòng)的登錄界面是沒有目標(biāo)Activity的,所以直接finish,如果有那么通過setClassName設(shè)置啟動(dòng)的目標(biāo)activity后直接通過這個(gè)intent啟動(dòng),注意此時(shí)這個(gè)intent中還攜帶了我們目標(biāo)activity中需要的參數(shù),這樣登錄成功后就成功跳轉(zhuǎn)到了目標(biāo)activity,參數(shù)也正常的傳遞了。到此整個(gè)流程分析完畢。

最后當(dāng)我們?cè)赼ctivit中使用時(shí),直接在Activit中調(diào)用

 checkLoginToStart<UserCenterActivity>()

如果你需要給Activity傳遞參數(shù) 則

checkLoginToStart<UserCenterActivity>(KEY to VALUE)

這樣一來(lái)少了一層邏輯判斷,代碼可讀性也更高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,357評(píng)論 25 708
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,524評(píng)論 0 17
  • 前言 人生苦多,快來(lái) Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,276評(píng)論 9 118
  • 效果如圖: 點(diǎn)擊錄音進(jìn)度條開始,再次點(diǎn)擊暫停,會(huì)在暫停的地方有一個(gè)白色的斷點(diǎn)。先說說大概的思路,進(jìn)度條的xml文件...
    撕裂的我閱讀 3,239評(píng)論 1 1
  • [cp]hi大家好!我是你們的好友娟娟,我是70后的二個(gè)孩子的寶媽,我從事微商一年多了幸運(yùn)的遇上了櫻漫雪有限公司,...
    櫻漫雪娟娟閱讀 230評(píng)論 0 0