Android Lifecycle組件淺析

Architecture Components 1.1.0穩(wěn)定版已經(jīng)發(fā)布碘饼,可以放心地用到項目了。
下面將結(jié)合文檔簡單地介紹一下其中的生命周期管理組件( Lifecycle-Aware Components)悲伶。

設(shè)計目的

更好更容易地編寫和組織Android組件(例如Activity和Fragment)中生命周期相關(guān)(例如onStart()和onStop())的代碼艾恼。

如何引入

Support Library 26.1.0之后的版本的Fragments和Activities都已經(jīng)實現(xiàn)了相關(guān)的接口(LifecycleOwner)。
所以直接繼承Support Library的AppCompatActivity或者Fragment就可以使用麸锉。
注意:如果Support Library 低于26.1.0钠绍,則需要繼承LifecycleActivity和LifecycleFragment才能使用。

面臨的問題

常見的問題:需要在Activity和Fragment中管理異步任務(wù)或者一些系統(tǒng)資源花沉。
下面是一個關(guān)于定位組件的生命周期管理問題柳爽。可以看到碱屁,即使將管理行為都封裝在MyLocationListener類中磷脯,但還是無法避免對Activity的生命周期函數(shù)onXXXX()加入不少代碼。如果需要管理更多的組件娩脾,問題就更明顯了赵誓。

class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
}


class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    @Override
    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, (location) -> {
            // update UI
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        myLocationListener.start();
        // manage other components that need to respond
        // to the activity lifecycle
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
        // manage other components that need to respond
        // to the activity lifecycle
    }
}

Lifecycle-Aware Components

  • Lifecycle
    Lifecycle被設(shè)計為擁有了組件(例如Activity)的生命周期信息,允許其他對象訂閱這些生命周期的信息。使用了觀察者模式俩功,詳細可以看看源代碼幻枉。
    其中有兩個重要的枚舉類:
    Event - 這些事件對應(yīng)了組件(Activity和Fragment)的回調(diào)事件。
    State - 組件當(dāng)前的狀態(tài)
  • LifecycleOwner
    用于表示實現(xiàn)了Lifecycle功能诡蜓。單方法接口熬甫,只有g(shù)etLifecycle()一個方法。Support Library的AppCompatActivity和Fragment都實現(xiàn)了此接口万牺。

例子

class MyLocationListener  implements LifecycleObserver {
     //通過注解回調(diào)
     @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void start() {
        ...
    }
     //通過注解回調(diào)
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void stop() {
       ...
    }
}


class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    @Override
    public void onCreate(...) {
        ...
        //觀察生命周期變化
        this.getLifecycle().addObserver(new MyLocationListener());
    }
}

從例子可以看出罗珍,這些外部資源的管理代碼很好地和Activity和Fragment的進行了分離。

  • Support Library中Activity和Fragment中的實現(xiàn)
    原理比較簡單脚粟,就是在生命周期回調(diào)方法中(onXXXX()方法)同步改變Lifecycle組件中的狀態(tài)覆旱。因為Lifecycle是被觀察者,所以狀態(tài)改變的事件也就同時發(fā)出去了核无。具體可以看看源碼扣唱。比較有意思的是Activity中的實現(xiàn),借助了一個不可見的ReportFragment去改變Lifecycle組件的狀態(tài)团南。這種借助的不可見Fragment的思路噪沙,值得借鑒一下。

擴展應(yīng)用

RxLifecycle吐根,這個庫簡化了在RxJava/RxAndroid下管理生命周期的問題
Lifecycle-Aware Components和RxLifecycle可以很好地結(jié)合使用正歼,配合Kotlin更是簡單到不能再簡單了。

  • 引入
compile 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'

// 使用Java拷橘,配合Android Lifecycle
compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.1'

// 使用Kotlin局义,配合Android Lifecycle
compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.1'
  • Java用法
public class MyActivity extends AppCompatActivity {
    private final LifecycleProvider<Lifecycle.Event> provider
        = AndroidLifecycle.createLifecycleProvider(this);

    @Override
    public void onResume() {
        super.onResume();
        myObservable
            .compose(provider.bindToLifecycle())
            .subscribe();
    }
}
  • Kotlin用法
myObservable
    .bindUntilEvent(myAppCompatActivity, ON_STOP)
    .subscribe { }

資源

官方文檔: https://developer.android.com/topic/libraries/architecture/lifecycle

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冗疮,隨后出現(xiàn)的幾起案子萄唇,更是在濱河造成了極大的恐慌,老刑警劉巖术幔,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件另萤,死亡現(xiàn)場離奇詭異,居然都是意外死亡诅挑,警方通過查閱死者的電腦和手機四敞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拔妥,“玉大人忿危,你說我怎么就攤上這事《镜眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兜畸。 經(jīng)常有香客問我努释,道長,這世上最難降的妖魔是什么咬摇? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任伐蒂,我火速辦了婚禮,結(jié)果婚禮上肛鹏,老公的妹妹穿的比我還像新娘逸邦。我一直安慰自己,他們只是感情好在扰,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布缕减。 她就那樣靜靜地躺著,像睡著了一般芒珠。 火紅的嫁衣襯著肌膚如雪桥狡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天皱卓,我揣著相機與錄音裹芝,去河邊找鬼。 笑死娜汁,一個胖子當(dāng)著我的面吹牛嫂易,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掐禁,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怜械,長吁一口氣:“原來是場噩夢啊……” “哼唇敞!你這毒婦竟也來了己英?” 一聲冷哼從身側(cè)響起撑蚌,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤删铃,失蹤者是張志新(化名)和其女友劉穎好唯,沒想到半個月后政供,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轻庆,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡竹海,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年般又,在試婚紗的時候發(fā)現(xiàn)自己被綠了彼绷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡茴迁,死狀恐怖寄悯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堕义,我是刑警寧澤猜旬,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響洒擦,放射性物質(zhì)發(fā)生泄漏椿争。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一熟嫩、第九天 我趴在偏房一處隱蔽的房頂上張望秦踪。 院中可真熱鬧,春花似錦掸茅、人聲如沸椅邓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽景馁。三九已至,卻和暖如春陵且,著一層夾襖步出監(jiān)牢的瞬間裁僧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工慕购, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留聊疲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓沪悲,卻偏偏與公主長得像获洲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子殿如,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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