Android Kotlin Jetpack之Lifecycles

前言

因為公司要用到Jetpack缕允,所以這邊也就聊聊下Jetpack之一的Lifecycles,順便做下筆記來加深自己對這一塊的理解

Jetpack

Jetpack是什么呢掂恕?Jetpack就一個開發(fā)集合包(就是我們平時用到的庫那些)拖陆,用官方的話說就是

Android Jetpack 組件是庫的集合,這些庫是為協(xié)同工作而構(gòu)建的懊亡,不過也可以單獨采用依啰,同時利用 Kotlin 語言功能幫助您提高工作效率〉暝妫可全部使用速警,也可混合搭配叹誉!

Lifecycles

Lifecycles是Jetpack當中的一個來解決生命周期管理問題的組件通過監(jiān)聽生命周期的方式(Handling Lifecycles with Lifecycle-Aware Components)

常規(guī)來說,如果我們的類不是Activity的話(廣播\碎片另說)闷旧,那么它是沒有生命周期的长豁。但在開發(fā)過程中,如我們的MVP模式忙灼,我們需要在Presenter里回調(diào)View的接口來更新UI匠襟,如果不對Presenter進行生命周期做處理的話,是很容易發(fā)生內(nèi)存泄漏問題的该园,所以為了讓Presenter感知Activity的生命周期酸舍,通常會寫出如下代碼

public interface IPresenter {
    void onCreate();
    void onStart();
    void onResume();
    void onPause();
    void onStop();
    void onDestroy();
}

Presenter實現(xiàn)這些接口,然后在對應的Activity里回調(diào)這些接口里初,完成生命周期管理啃勉。這個方法通俗易懂,好不好用另說青瀑,但代碼量肯定多了璧亮,每個Presenter都要實現(xiàn)IPresenter 。
而Lifecycles就是實現(xiàn)這一功能而推出的斥难,它是一個可以被其他對象觀察其生命周期的類枝嘶,Lifecycles是基于觀察者模式實現(xiàn)的來對外響應生命周期的變化的,這里面有2個枚舉變量Event和Evenet來一一對應(到時候看用法就知道了)哑诊。

導入

正常情況下使用Android studio 3.2 以上的版本新建項目都是可以直接用的(這段可以直接跳過)
首先我們要依賴Google倉庫群扶,在project -> build.gradle里

  repositories {
        //一般來說自動生成的項目都會默認依賴Google和Jcenter倉庫的
        google()
        jcenter()
    }

然后是Module -> build.gradle

dependencies {
    def lifecycle_version = "2.0.0"

    // ViewModel and LiveData
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    // alternatively - just ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" // For Kotlin use lifecycle-viewmodel-ktx
    // alternatively - just LiveData
    implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
    // alternatively - Lifecycles only (no ViewModel or LiveData). Some UI
    //     AndroidX libraries use this lightweight import for Lifecycle
    implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"

    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
    // alternately - if using Java8, use the following instead of lifecycle-compiler
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

    // optional - ReactiveStreams support for LiveData
    implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version" // For Kotlin use lifecycle-reactivestreams-ktx

    // optional - Test helpers for LiveData
    testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
}

這個是Google官方文檔的導入說明,因為一般來說LiveData镀裤、ViewModel竞阐,Lifecycles都是會一起用到的,你可以看注釋按需導入暑劝。

使用

我們可以讓一個類實現(xiàn)LifecycleObserver接口后通過注解的方式來監(jiān)聽對應的生命周期

class MyObserver : LifecycleObserver{

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun lifecycleOnCreate(){
        Log.e(TAG,"lifecycleOnCreate")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun lifecycleOnStart(){
        Log.e(TAG,"lifecycleOnStart")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun lifecycleOnResume(){
        Log.e(TAG,"lifecycleOnResume")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun lifecycleOnPause(){
        Log.e(TAG,"lifecycleOnPause")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun lifecycleOnStop(){
        Log.e(TAG,"lifecycleOnStop")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun lifecycleOnDestroy(){
        Log.e(TAG,"lifecycleOnADestroy")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    fun lifecycleOnAny(){
        Log.e(TAG,"lifecycleOnAny")
    }
}

然后通過在相應的Activity里addObserver()即可完成監(jiān)聽(在onResume之前)骆莹,方便觀察我們再在對應的生命周期打印log

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lifecycle.addObserver(MyObserver())
        Log.e(TAG,"onCreate")
    }

    override fun onStart() {
        super.onStart()
        Log.e(TAG,"onStart")
    }

    override fun onResume() {
        super.onResume()
        Log.e(TAG,"onResume")
    }

    override fun onPause() {
        super.onPause()
        Log.e(TAG,"onPause")
    }

    override fun onStop() {
        super.onStop()
        Log.e(TAG,"onStop")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.e(TAG,"onDestroy")
    }
}

可以看到:

  • onAny是在任何一個生命周期都會被調(diào)用
  • Lifecycles的監(jiān)聽在onCreate()、onStart()担猛、onResume()之后調(diào)用的幕垦,而onPause()、onStop()傅联、onDestroy()則是之前調(diào)用

其實很容易理解Lifecycles如果在onPause()先改、onStop()、onDestroy()如果在之后調(diào)用的話蒸走,那我還有用他來干嘛仇奶,我就是要在那個時間段進行某些操作的,之后再調(diào)不就晚了比驻?

LifecycleOwner

簡單得說就是Activity需要實現(xiàn)LifecycleOwner才有剛剛上圖說展示的Lifecycles效果该溯,但是岛抄,如果你的Android Support 版本是v26.1.0以上,或者使用的是AndroidX狈茉,那么你可以不用理這個弦撩,因為谷歌已經(jīng)幫我們弄好了

LifecycleOwner是一個有生命周期的接口,與LifecycleObserver里面的生命周期相對應论皆,因為Lifecycles是基于觀察者模式實現(xiàn)的益楼,LifecycleObserver是觀察者,那么被觀察者就是LifecycleOwner点晴。
而LifecycleOwner里面有一個getLifecycle()方法且必須被實現(xiàn)感凤,是用來獲取到觀察者的。
在Activity里面使用Lifecycles時粒督,關(guān)鍵是這一句代碼

lifecycle.addObserver(MyObserver())

事實上lifecycle里調(diào)用的就是這個方法

  /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @Override
    public Lifecycle getLifecycle() {
        return super.getLifecycle();
    }

那么老版本的Activity要怎么實現(xiàn)LifecycleOwner呢陪竿?
實現(xiàn)LifecycleOwner接口,并在對應的生命周期進行操作(和IPresenter一模一樣)

class MainActivity : AppCompatActivity(),LifecycleOwner {

    private lateinit var mLifecycleRegistry: LifecycleRegistry

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mLifecycleRegistry = LifecycleRegistry(this)
        mLifecycleRegistry.markState(Lifecycle.State.CREATED)
        mLifecycleRegistry.addObserver(MyObserver())
    }

    override fun onStart() {
        super.onStart()
        mLifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    override fun onResume() {
        super.onResume()
        mLifecycleRegistry.markState(Lifecycle.State.RESUMED)
    }

    override fun onPause() {
        super.onPause()
        mLifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    override fun onStop() {
        super.onStop()
        mLifecycleRegistry.markState(Lifecycle.State.CREATED)
    }

    override fun onDestroy() {
        super.onDestroy()
        mLifecycleRegistry.markState(Lifecycle.State.DESTROYED)
    }

    override fun getLifecycle(): Lifecycle {
        return mLifecycleRegistry
    }
}

眼尖的小伙伴肯定看到了屠橄,onCreat()和onStop()共用了CREATED族跛,onStart()和onPause()公用了STARTED這個狀態(tài),因為在Activity的生命周期里锐墙,這4個生命周期也是互相對應了礁哄,為了節(jié)省內(nèi)存,谷歌干脆就共用了溪北。

結(jié)語

到這里桐绒,Lifecycles的用法也已經(jīng)說完了,如何用Lifecycles封裝基類相信不用說大家也有個思路了之拨,其實Lifecycles的用法不止這些茉继,而之后的LiveData和ViewModel才是更厲害的,但這3個是相輔相成的蚀乔,所以就先來講下Lifecycles烁竭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吉挣,隨后出現(xiàn)的幾起案子派撕,更是在濱河造成了極大的恐慌,老刑警劉巖听想,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腥刹,死亡現(xiàn)場離奇詭異马胧,居然都是意外死亡汉买,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門佩脊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛙粘,“玉大人垫卤,你說我怎么就攤上這事〕瞿粒” “怎么了穴肘?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舔痕。 經(jīng)常有香客問我评抚,道長,這世上最難降的妖魔是什么伯复? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任慨代,我火速辦了婚禮,結(jié)果婚禮上啸如,老公的妹妹穿的比我還像新娘侍匙。我一直安慰自己,他們只是感情好叮雳,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布想暗。 她就那樣靜靜地躺著,像睡著了一般帘不。 火紅的嫁衣襯著肌膚如雪说莫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天寞焙,我揣著相機與錄音唬滑,去河邊找鬼。 笑死棺弊,一個胖子當著我的面吹牛晶密,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播模她,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稻艰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侈净?” 一聲冷哼從身側(cè)響起尊勿,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畜侦,沒想到半個月后元扔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡旋膳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年澎语,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡擅羞,死狀恐怖尸变,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情减俏,我是刑警寧澤召烂,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站娃承,受9級特大地震影響奏夫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜历筝,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一桶蛔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漫谷,春花似錦仔雷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惕稻,卻和暖如春竖共,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俺祠。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工公给, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜘渣。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓淌铐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔫缸。 傳聞我的和親對象是個殘疾皇子腿准,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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