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)系作者
  • 序言:七十年代末露该,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子第煮,更是在濱河造成了極大的恐慌解幼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件包警,死亡現(xiàn)場(chǎng)離奇詭異撵摆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)害晦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門特铝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人壹瘟,你說我怎么就攤上這事鲫剿。” “怎么了俐筋?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵牵素,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我澄者,道長(zhǎng)笆呆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任粱挡,我火速辦了婚禮赠幕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘询筏。我一直安慰自己榕堰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布嫌套。 她就那樣靜靜地躺著逆屡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪踱讨。 梳的紋絲不亂的頭發(fā)上魏蔗,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音痹筛,去河邊找鬼莺治。 笑死廓鞠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谣旁。 我是一名探鬼主播床佳,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榄审!你這毒婦竟也來(lái)了砌们?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搁进,失蹤者是張志新(化名)和其女友劉穎怨绣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拷获,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篮撑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匆瓜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赢笨。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驮吱,靈堂內(nèi)的尸體忽然破棺而出茧妒,到底是詐尸還是另有隱情,我是刑警寧澤左冬,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布桐筏,位于F島的核電站,受9級(jí)特大地震影響拇砰,放射性物質(zhì)發(fā)生泄漏梅忌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一除破、第九天 我趴在偏房一處隱蔽的房頂上張望牧氮。 院中可真熱鬧,春花似錦瑰枫、人聲如沸踱葛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尸诽。三九已至,卻和暖如春盯另,著一層夾襖步出監(jiān)牢的瞬間性含,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工土铺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胶滋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓悲敷,卻偏偏與公主長(zhǎng)得像究恤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子后德,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

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