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

態(tài)度決定一切 細(xì)節(jié)決定成敗

一干毅、前言

——回顧了一下之前學(xué)習(xí)過的東西并打算把這些東西整理成文章川慌,加深映像和理解,同時(shí)也傳達(dá)自己的見解供大家參考钳枕,若存在錯(cuò)誤或不足的地方,希望您能指出赏壹。
本篇主要介紹Lifecycle鱼炒,根據(jù)下面結(jié)構(gòu)圖進(jìn)行分析。

本篇結(jié)構(gòu)圖

LifeCycle相關(guān)鏈接——官方文檔蝌借、接口文檔昔瞧、相關(guān)依賴文檔

二、簡介

(1)是什么

—— Lifecycle 是具有生命周期感知能力的組件菩佑。簡單的理解當(dāng)Activity/Fragment的生命周期產(chǎn)生變化時(shí)硬爆,lifeCycle組件也會(huì)有相應(yīng)的生命周期變化。我們可以通過使用lifeCycle組件在自定義的類中管理Activity/fragment的生命周期擎鸠。
主要由三大部分構(gòu)成:Lifecycle缀磕、LifecycleOwner、LifecycleObserver

  • Lifecycle:是一個(gè)持有組件生命周期狀態(tài)與事件(如Activity或Fragment)的信息的類
  • LifecycleOwner:Lifecycle的提供者劣光,通過實(shí)現(xiàn)LifecycleOwner接口來訪問Lifecycle(生命周期)對象袜蚕。Fragment和FragmentActivity類實(shí)現(xiàn)了LifecycleOwner接口,它具有訪問生命周期的getLifecycle方法绢涡。您還可以在自己的類中實(shí)現(xiàn)LifecycleOwner牲剃。
  • LifecycleObserver:Lifecycle觀察者,實(shí)現(xiàn)該接口的類雄可,通過注解的方式凿傅,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法注冊,被注冊后,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件数苫。

(2)有什么用

—— 常見的模式是在Activity和Fragment的生命周期方法中實(shí)現(xiàn)依賴組件的操作(取消注冊/監(jiān)聽聪舒,釋放內(nèi)存...),如果不這樣做可能會(huì)觸發(fā)內(nèi)存泄漏甚至應(yīng)用程序崩潰虐急。然而箱残,這種模式會(huì)導(dǎo)致糟糕的代碼組織和錯(cuò)誤的擴(kuò)散,。通過使用生命周期感知組件,您可以將依賴組件的代碼移出生命周期方法被辑,并移到組件本身燎悍。

這里舉個(gè)官方文檔的例子說明一下,也更容易理解
常見的模式

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
    }
}

實(shí)際的運(yùn)用中盼理,Activity的onStart()和onStop()方法中會(huì)有很多的調(diào)用來管理UI和其他組件谈山,以響應(yīng)生命周期的當(dāng)前狀態(tài)。管理多個(gè)組件會(huì)在生命周期方法中放置大量的代碼宏怔,這使得它們很難維護(hù)勾哩。

Lifecycle模式

public class MyLocationListener implements LifecycleObserver {
    private static final String TAG = "MyLocationListener ";
    public MyLocationListener(Context context, Callback callback) { /*...*/ }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start(){
        Log.e(TAG, "start: " );
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop(){
        Log.e(TAG, "stop: " );
    }
}
//Activity/Fragment中使用
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyLocationListener myLocationListener = new MyLocationListener(this, (location) -> { /* update UI */ });
    getLifecycle().addObserver(myLocationListener );
}

通過Lifecycle組件可以在各自的類中通過注釋響應(yīng)生命周期的當(dāng)前狀態(tài)。

(3)有什么優(yōu)點(diǎn)

1.結(jié)構(gòu)更加清晰举哟,更容易管理生命周期
2.降低維護(hù)難度
3.降低耦合度

就是如此簡單而又好用,那么具體如何使用請看下文分解迅矛。

三妨猩、基本使用

(4)怎么使用

  • 添加依賴

implementation 'androidx.appcompat:appcompat:1.1.0'

// 可選
dependencies {
    def lifecycle_version = "2.1.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"
}
  • 定義觀察者
// 定義一個(gè)類實(shí)現(xiàn)LifecycleObserver接口,通過向其方法添加注釋來監(jiān)視組件的生命周期狀態(tài)
public class MyObserver implements LifecycleObserver {
    private static final String TAG = "MyObserver";
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start(){
        Log.e(TAG, "start: " );
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop(){
        Log.e(TAG, "stop: " );
    }
}
  • 添加觀察者
//通過調(diào)用生命周期類的addObserver()方法并傳遞觀察者的實(shí)例來添加觀察者。
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyObserver myObserver = new MyObserver();
    getLifecycle().addObserver(myObserver);
}

這里提供入門級使用方式秽褒,下面舉個(gè)例子

  • 案例
    ——廣播的注冊與取消注冊處理

1.定義廣播接收者

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("onReceive: action ",intent.getAction());
        Log.e("onReceive: content ",intent.getStringExtra("content"));
    }
}

2.定義lifecycle觀察者

class BroadCastObserver implements LifecycleObserver {
    private static final String TAG = "BroadCastObserver";
    private Activity mActivity;
    private MyBroadcastReceiver mBroadcastReceiver;
    public BroadCastObserver(Activity activity) {
        this.mActivity = activity;
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void register(){
        Log.e(TAG, "register: " );
        mBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("xxx");
        mActivity.registerReceiver(mBroadcastReceiver, intentFilter);
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void unRegister(){
        Log.e(TAG, "unRegister: " );
        mActivity.unregisterReceiver(mBroadcastReceiver);
    }
}

3.添加觀察者

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BroadCastObserver mBroadCastObserver = new BroadCastObserver(this);
        getLifecycle().addObserver(mBroadCastObserver);
    }

4.發(fā)送廣播

    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setAction("xxx");
        intent.putExtra("content", "廣播1號");
        sendBroadcast(intent);
    }

輸出結(jié)果

好了壶硅,使用方式就簡單介紹到這里。大家有空也可以自己試試Service

四销斟、原理

本來想寫成一篇的庐椒,結(jié)果發(fā)現(xiàn)分析的源碼有點(diǎn)多,只好拆開來蚂踊。避免篇幅太長约谈,看著累。犁钟。棱诱。
《Android Jetpack架構(gòu)組件之Lifecycle源碼分析》

五、總結(jié)

也不知道要寫什么涝动。就簡單描述一下使用過程迈勋,lifecycle使用了觀察者模式。
1.先聲明了一個(gè)觀察者醋粟,用來監(jiān)聽被觀察者(Activity/Fragment)靡菇。
2.觀察者通過實(shí)現(xiàn)LifecycleObserver接口,使用注解來監(jiān)聽被觀察者發(fā)生的變化米愿。
3.那么是如何監(jiān)聽的厦凤,這次就使用到了lifecycle。lifecycle相當(dāng)于一個(gè)橋梁育苟,把兩者關(guān)聯(lián)在一起泳唠。
4.被觀察者通過實(shí)現(xiàn)LifecycleOwner接口先連接了橋梁。
5.觀察者則通過getLifecycle().addObserver()方法也建立起連接宙搬。
通俗描述大概就是這么一回事笨腥,具體的實(shí)現(xiàn)方式還是要根據(jù)源碼來分析拓哺。事實(shí)并沒想的這么簡單,源碼也是挺多脖母。

六士鸥、內(nèi)容推薦

七、項(xiàng)目參考

Demo例子鑲嵌到下面Demo中
Github ——apk下載體驗(yàn)地址
若您發(fā)現(xiàn)文章中存在錯(cuò)誤或不足的地方谆级,希望您能指出烤礁!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肥照,隨后出現(xiàn)的幾起案子脚仔,更是在濱河造成了極大的恐慌,老刑警劉巖舆绎,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲤脏,死亡現(xiàn)場離奇詭異,居然都是意外死亡吕朵,警方通過查閱死者的電腦和手機(jī)猎醇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來努溃,“玉大人硫嘶,你說我怎么就攤上這事∥嗨埃” “怎么了沦疾?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長第队。 經(jīng)常有香客問我曹鸠,道長,這世上最難降的妖魔是什么斥铺? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任彻桃,我火速辦了婚禮,結(jié)果婚禮上晾蜘,老公的妹妹穿的比我還像新娘邻眷。我一直安慰自己,他們只是感情好剔交,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布肆饶。 她就那樣靜靜地躺著,像睡著了一般岖常。 火紅的嫁衣襯著肌膚如雪驯镊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音板惑,去河邊找鬼橄镜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冯乘,可吹牛的內(nèi)容都是我干的洽胶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼裆馒,長吁一口氣:“原來是場噩夢啊……” “哼姊氓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喷好,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翔横,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后梗搅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禾唁,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年些膨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦铺。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡订雾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矛洞,到底是詐尸還是另有隱情洼哎,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布沼本,位于F島的核電站噩峦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抽兆。R本人自食惡果不足惜识补,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屎鳍。 院中可真熱鬧怕轿,春花似錦拍冠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽名惩。三九已至澎胡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背攻谁。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工稚伍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巢株。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓槐瑞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阁苞。 傳聞我的和親對象是個(gè)殘疾皇子困檩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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