Android架構(gòu)組件之Lifecycle

LifecycleGoogle I/O 大會(huì)上發(fā)布的架構(gòu)組件,現(xiàn)階段正式版已經(jīng)推出莱衩。Lifecycle是用于生命周期管理的一個(gè)組件蔚约。它可以減少內(nèi)存泄露和崩潰的可能性衡奥。同時(shí),生命周期庫(kù)是其他架構(gòu)組件(如 LiveData)的基礎(chǔ)吕喘,所以建議優(yōu)先擼它赘那。
如果需要配置請(qǐng)參考
相關(guān)Gradle配置參考

Lifecycle的基本使用

在傳統(tǒng)的MVP中,如果需要在Presenter類里面管理Activity或者fragment的生命周期大概就需要寫如下的代碼氯质,

/**
 * Created by Hubery on 2018/7/1.
 */
class FirstActivity : AppCompatActivity() {
    companion object {
        val TAG = FirstActivity.javaClass.simpleName
    }

    private var mFirstPresenter: FirstPresenter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mFirstPresenter = FirstPresenter(this)
        mFirstPresenter?.onCreate()
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "onDestroy()")
        mFirstPresenter?.onDestroy()
    }
}

interface IPresenter {
    fun onCreate()
    fun onDestroy()
}

class FirstPresenter(context:Context):IPresenter {

    override fun onCreate() {
        Log.d("FristPresenter","onCreate")
    }

    override fun onDestroy() {
        Log.d("FristPresenter","onDestroy")
    }
}

在這里為了簡(jiǎn)潔漓概,只實(shí)現(xiàn)了兩個(gè)生命周期,其他的生命周期同理病梢,先實(shí)現(xiàn)一個(gè)IPresenter的接口胃珍,然后實(shí)現(xiàn)頁(yè)面的Presenter代碼,如果需要保持和FirstActivity生命周期一致蜓陌,需要分別的FirstActivity生命周期里的每個(gè)方法里面去進(jìn)行回調(diào)觅彰。這樣寫比較麻煩,有沒有什么簡(jiǎn)潔的管理生命周期的方式钮热,答案是Lifecycle填抬。
現(xiàn)在我們來(lái)看看Lifecycle的實(shí)現(xiàn)方式:

interface IPresenter : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate(owner: LifecycleOwner)

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy(owner: LifecycleOwner)
}

class CustomPresenter :IPresenter{
    override fun onCreate(owner: LifecycleOwner) {
        Log.d("BasePresenter","onCreate()")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        Log.d("BasePresenter","onDestroy()")
    }
}


/**
 * Created by Hubery on 2018/7/1.
 */
class FirstActivity : AppCompatActivity() {
    companion object {
        val TAG = FirstActivity.javaClass.simpleName
    }

    private var mPresenter: CustomPresenter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mPresenter = CustomPresenter(this)
        getLifecycle().addObserver(mPresenter)
    }

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

使用LifecycleActivity里面就一句getLifecycle().addObserver(mPresenter),就可以達(dá)到管理生命周期,這里需要注意的兩點(diǎn):
1隧期,這里的Activity需要繼承AppCompatActivity飒责;
2赘娄,這里的demo使用的java 7IPresenter接口的時(shí)候需要實(shí)現(xiàn)LifecycleObserver通過(guò)注解的方式來(lái)接收生命周期的變化,而在java8里面只需要去實(shí)現(xiàn)DefaultLifecycleObserver宏蛉,然后重寫里面的生命周期方法即可遣臼。

Lifecycle基本原理

借鑒ShymanZhu的圖

lifecycle.png

LifecycleObserverLifecycle觀察者的角色,通過(guò)addObserver(@NonNull LifecycleObserver observer)方法注冊(cè)拾并,java 7中需要實(shí)現(xiàn)LifecycleObserver是通過(guò)注解的方式來(lái)接收生命周期的變化揍堰,而在java 8里面只需要去實(shí)現(xiàn)DefaultLifecycleObserver,然后重寫里面的生命周期方法即可嗅义。注冊(cè)之后通過(guò)LifecycleObserver便可以觀察到LifecycleOwner中持有的Lifecycle對(duì)象的生命周期變化屏歹。

LifecycleOwnerLifecycleOwner接口中,唯一定義的方法是getLifecycle(),通過(guò)實(shí)現(xiàn)該接口就可以獲得Lifecycle對(duì)象之碗,實(shí)現(xiàn)該接口的類持有生命周期(Lifecycle對(duì)象)蝙眶。

LifecycleLifecycle是一個(gè)抽象類且是生命周期類,它內(nèi)部定義了一個(gè)addObserver添加事件褪那,removeObserver移除事件械馆,getCurrentState獲取當(dāng)前生命周期的狀態(tài),Event事件和State狀態(tài)的枚舉武通。

LifecycleRegistry:Lifecycle的實(shí)現(xiàn)類。

上面就是基本的類和接口的功能和作用之后珊搀,我們接下來(lái)看看Fragment和他們之間的聯(lián)系冶忱。
Fragment里面可以看到下面的代碼

   LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

我們上面已經(jīng)說(shuō)過(guò)了,通過(guò)實(shí)現(xiàn)LifecycleOwner重寫getLifecycle方法是可以獲得Lifecycle對(duì)象境析,而LifecycleRegistryLifecycle的實(shí)現(xiàn)類囚枪。

//下面的代碼省略了部分
 void performStart() {
        mState = STARTED;
        onStart();          
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);             
    }

void performResume() {
        mState = RESUMED;
        onResume();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
    }

 void performPause() {
      mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
        mState = STARTED;
        onPause();
    }
//...

代碼比較多就不一一貼出來(lái)了,需要注意的是在這些生命周期里面劳淆,mLifecycleRegistry放置的位置是有變化的链沼。
Fragment里面,在執(zhí)行不同的生命周期的時(shí)候沛鸵,會(huì)先調(diào)用performXX方法括勺,然后在里面真正的執(zhí)行生命周期的XX方法,并且會(huì)執(zhí)行mLifecycleRegistryhandleLifecycleEvent方法曲掰。

   public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }

handleLifecycleEvent方法會(huì)通過(guò) getStateAfter 傳入當(dāng)前的狀態(tài)疾捍,并修改State值,之后會(huì)遍歷FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap<>()集合里面的元素栏妖,并 由LifecycleObserver 并同步且通知LifecycleOwner改變生命周期乱豆。

mLifecycleObserver.onStateChanged(owner, event);

再次感謝ShymanZhu的時(shí)序圖:

lifecycle_two.png

Fragment拿到Lifecycle生命周期,然后通過(guò)Observer注冊(cè)監(jiān)聽吊趾,最后再生命周期過(guò)程中依次調(diào)用圖中的方法宛裕,這下是不是比較清晰了瑟啃。

Android架構(gòu)組件之LiveData

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市揩尸,隨后出現(xiàn)的幾起案子蛹屿,更是在濱河造成了極大的恐慌,老刑警劉巖疲酌,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜡峰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朗恳,警方通過(guò)查閱死者的電腦和手機(jī)湿颅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粥诫,“玉大人油航,你說(shuō)我怎么就攤上這事』辰” “怎么了谊囚?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)执赡。 經(jīng)常有香客問我镰踏,道長(zhǎng),這世上最難降的妖魔是什么沙合? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任奠伪,我火速辦了婚禮,結(jié)果婚禮上首懈,老公的妹妹穿的比我還像新娘绊率。我一直安慰自己,他們只是感情好究履,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布滤否。 她就那樣靜靜地躺著,像睡著了一般最仑。 火紅的嫁衣襯著肌膚如雪藐俺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天泥彤,我揣著相機(jī)與錄音紊搪,去河邊找鬼。 笑死全景,一個(gè)胖子當(dāng)著我的面吹牛耀石,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼滞伟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揭鳞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起梆奈,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤野崇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亩钟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乓梨,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年清酥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扶镀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焰轻,死狀恐怖臭觉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辱志,我是刑警寧澤蝠筑,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站揩懒,受9級(jí)特大地震影響什乙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜已球,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一臣镣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧和悦,春花似錦、人聲如沸渠缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亦鳞。三九已至馍忽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燕差,已是汗流浹背遭笋。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徒探,地道東北人瓦呼。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像测暗,于是被迫代替她去往敵國(guó)和親央串。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磨澡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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