Lifecycle-生命周期感知型組件

簡介

Lifecycle是Google推薦的架構(gòu)組件之一.

生命周期感知型組件可執(zhí)行操作來響應另一個組件(如 Activity 和 Fragment)的生命周期狀態(tài)的變化。這些組件有助于您寫出更有條理且往往更精簡的代碼校赤,這樣的代碼更易于維護马篮。

通過使用生命周期感知型組件,您可以將依賴組件的代碼從生命周期方法移入組件本身中浑测。

我們來描述一種業(yè)務場景來幫助我們更好的理解上面這段話的意義。

當我們的Activity中使用了自定義的播放器組件時掷匠,我們通常需要在Activity的onResume和onPause中做一些播放和暫停播放的操作讹语,并在onDestroy中停止/釋放播放器。當我們的Activity中有更多類似的組件時株灸,會使得onResume和onPause等生命周期方法的邏輯過于復雜且不易于維護擎值。這種場景下通過使用Lifecycle組件鸠儿,可以使原本在Activity中的代碼邏輯进每,集成到播放器等組件內(nèi),使得組件的邏輯更加內(nèi)斂田晚,更易于維護贤徒。

使用

Lifecycle通過觀察者模式汇四,使得其他的組件可以感知另一個組件(Activity和Fragment等)的生命周期變化通孽。

LifeCycleOwner

直譯過來就是生命周期所有者,接口中只定義了一個方法getLifecycle()返回一個Lifecycle對象背苦,可以讓其他對象有生命周期的對象實現(xiàn)Lifecycle功能行剂。

在Android Support Library 26.1.0 及其之后已經(jīng)activity 和 fragment 已經(jīng)默認實現(xiàn)了LifecycleOwner硼讽。

LifecycleObserver

代碼如下:

public class MyObserver implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() {
        //TOOD: ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
        //TODO: ...
    }
}

//Activity或Fragment中
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());

這樣當該Activity的生命周期發(fā)生變化時MyObserver就可以監(jiān)聽到,做相應的處理壤躲。

自定義View:

public class TestLifeCycleView extends TextView {
    private static final String TAG = TestLifeCycleView.class.getSimpleName();

    private LifecycleObserver lifeCycleObserver;

    public TestLifeCycleView(Context context) {
        this(context, null);
    }

    public TestLifeCycleView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TestLifeCycleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public LifecycleObserver getLifeCycleObserver(){
        if(lifeCycleObserver == null){
            lifeCycleObserver = new LifecycleObserver() {
                @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
                public void onLifeOnCreate(){
                    Log.d(TAG, "onLifeOnCreate");
                }

                @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
                public void onLifeOnResume(){
                    Log.d(TAG, "onLifeOnResume");
                }

                @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
                public void onLifePause(){
                    Log.d(TAG, "onLifePause");
                }

                @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
                public void onLifeDestroy(){
                    Log.d(TAG, "onLifeDestroy");
                }
            };
        }

        return lifeCycleObserver;
    }
}

//Activity
testLifeCycleView = findViewById(R.id.test_lifecycle_view);
getLifecycle().addObserver(testLifeCycleView.getLifeCycleObserver());

總結(jié)

Lifecycle通過使用觀察者模式凌唬,巧妙的解決了Activity和Fragment生命周期方法過于臃腫難以維護的問題,也使得自定義View的相關邏輯操作內(nèi)斂到類中客税,使得代碼更加簡潔更耻,與Activity的耦合度更低捏膨,易于維護。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末目胡,一起剝皮案震驚了整個濱河市誉己,隨后出現(xiàn)的幾起案子域蜗,更是在濱河造成了極大的恐慌地消,老刑警劉巖脉执,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異婆廊,居然都是意外死亡淘邻,警方通過查閱死者的電腦和手機湘换,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扶平,“玉大人结澄,你說我怎么就攤上這事岸夯。” “怎么了勉吻?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵餐曼,是天一觀的道長鲜漩。 經(jīng)常有香客問我孕似,道長刮刑,這世上最難降的妖魔是什么喉祭? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮雷绢,結(jié)果婚禮上泛烙,老公的妹妹穿的比我還像新娘。我一直安慰自己翘紊,他們只是感情好蔽氨,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帆疟,像睡著了一般鹉究。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踪宠,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天自赔,我揣著相機與錄音,去河邊找鬼柳琢。 笑死绍妨,一個胖子當著我的面吹牛毙驯,可吹牛的內(nèi)容都是我干的尔苦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拗胜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后万哪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪猴。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡担租,死狀恐怖奋救,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情利耍,我是刑警寧澤程癌,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站中鼠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惫搏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧们何,春花似錦、人聲如沸鹦蠕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鉴吹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間般堆,已是汗流浹背始赎。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乡翅,地道東北人靶累。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓凛忿,卻偏偏與公主長得像叁熔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子著蛙,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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