成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Android 生命周期組件 Lifecycle 使用詳解

springDevBird / 3629人閱讀

摘要:括號(hào)里面的參數(shù),表明需要監(jiān)聽(tīng)的是什么生命周期事件。主要就是通過(guò)和這兩個(gè)枚舉類來(lái)跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)。這點(diǎn)和或者更低版本上的生命周期的調(diào)用順序并不匹配,需要稍加注意。

前言

2018 年的 Google I/O 大會(huì)上,Google 發(fā)布了 Android Jetpack,并稱其為下一代的 Android 組件,旨在幫助開(kāi)發(fā)者加快應(yīng)用開(kāi)發(fā)速度。準(zhǔn)確來(lái)講,Jetpack 是一系列 Android 軟件組件的集合,它包括基礎(chǔ)組件、架構(gòu)組件、行為組件、界面組件。其中的 Android Architecture Components 指的就是這里的 “架構(gòu)組件”。

Android Architecture Components 是 Google 推薦的一個(gè)構(gòu)建 APP 的應(yīng)用架構(gòu),它包含了一些列架構(gòu)相關(guān)組件。而本篇文章我們要介紹的 Lifecycle 就是其中的一個(gè)與生命周期相關(guān)的庫(kù),同時(shí),Lifecycle 也跟 LiveData 和 ViewModel 兩個(gè)庫(kù)緊密聯(lián)系,想要搞懂后兩者,就必須先搞懂它。

具體各組件之間的關(guān)系,以及各自在 Jetpack 中的地位,可以參見(jiàn)下面兩幅來(lái)源于官網(wǎng)的圖片。

Lifecycle 的作用

Lifecycle 是具有生命周期感知能力的組件,也就是說(shuō),我們能在 Activity 或者 Fragment 的生命周期發(fā)生變化的時(shí)候得到通知。我們往往會(huì)在 Activity 的各種生命中周期方法里執(zhí)行特定的方法,比如,進(jìn)行廣播的注冊(cè)和解綁、Eventbus 的注冊(cè)和解綁等:

public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }

    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
}

如果我們把很多這種需要跟生命周期相關(guān)的邏輯代碼都直接放在 Activity 的生命周期方法中,Activity 將會(huì)變得難以維護(hù)。通過(guò) Lifecycle,我們就能通過(guò)把這些邏輯抽離出來(lái),進(jìn)而避免這種問(wèn)題。因?yàn)楸举|(zhì)上我們需要的只是 Activity 或者 Fragment 的生命周期發(fā)生改變的時(shí)候能通知到我們,以便我們?cè)趯?duì)應(yīng)生命周期中執(zhí)行對(duì)應(yīng)的方法。

Lifecycle 的基本使用 2.0、 導(dǎo)入 Lifecycle 依賴

Lifecycle 被包含在 support library 26.1.0 及之后的依賴包中,如果我們的項(xiàng)目依賴的支持庫(kù)版本在 26.1.0及以上,那么不需要額外導(dǎo)入 Lifecycle 庫(kù),本篇例子中使用的支持庫(kù)是 28.0.0 :

    implementation "com.android.support:appcompat-v7:28.0.0"

如果支持庫(kù)版本小于 26.1.0 ,就需要多帶帶導(dǎo)入 Lifecycle 庫(kù) :

    implementation "android.arch.lifecycle:runtime:1.1.1"

當(dāng)然,如果項(xiàng)目已經(jīng)遷移到了 AndroidX,可以使用下面的方式引入 :

    implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"

還是建議大家嘗試盡快把項(xiàng)目遷移為 AndroidX,因?yàn)楹芏喔?,?huì)最先在 AndroidX 中發(fā)布,逐漸擺脫傳統(tǒng)的support包。比如這里要講的 Lifecycle 在 AndroidX 中已經(jīng)升級(jí)到了 2.x 版本,而支持庫(kù)中還是 1.x 版本。

鑒于支持庫(kù)一般都在 26.1.0 以上,并且尚有大部分用戶未遷移到AndroidX,在本篇文章中,我們使用 support library 28.0.0 中默認(rèn)包含的 Lifecycle 庫(kù)。我們?cè)陧?xiàng)目的 app 目錄下的 build.gradle 文件中添加以下依賴:

    implementation "com.android.support:appcompat-v7:28.0.0"

以 support library 版本在 26.1.0 及以上為前提,這里我們分兩種情況來(lái)講。一種是我們創(chuàng)建的Activity 繼承自 AppCompatActivity(以Activity 為例,F(xiàn)ragment類似),另一種是創(chuàng)建的 Activity 繼承自普通的 Activity,而非 AppCompatActivity。

這里要先說(shuō)一點(diǎn), Lifecycle 的實(shí)現(xiàn)機(jī)制是觀察者模式,意識(shí)到這點(diǎn),再講它的使用過(guò)程及原理就比較容易理解了。

整體流程:

構(gòu)建一個(gè) Lifecycle 對(duì)象(通過(guò)一個(gè)實(shí)現(xiàn)了 LifecycleOwner 接口的對(duì)象的 getLifecycle()方法返回),這個(gè)對(duì)象就是一個(gè)被觀察者,具有生命周期感知能力

構(gòu)建一個(gè) LifecycleObserver 對(duì)象,它對(duì)指定的 Lifecycle 對(duì)象進(jìn)行監(jiān)聽(tīng)

通過(guò)將 Lifecycle 對(duì)象的 addObserver(...) 方法,將 Lifecycle 對(duì)象和 LifecycleObserver 對(duì)象進(jìn)行綁定

2.1、 方式一:繼承自 AppCompatActivity

首先,我們創(chuàng)建一個(gè) MyObserver.java 類,讓它實(shí)現(xiàn) LifecycleObserver 接口( LifecycleObserver 接口是一個(gè)空接口,主要是給注解處理器使用),如下:

public class MyObserver implements LifecycleObserver {

    private static final String TAG = "MyObserver";

    // 使用注解  @OnLifecycleEvent 來(lái)表明該方法需要監(jiān)聽(tīng)指定的生命周期事件
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() {
//        ...
        Log.d(TAG, "connectListener:  --------   onResume" );
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
//        ...
        Log.d(TAG, "disconnectListener: -------   onPause");
    }
}

可以看到,我們通過(guò)在方法上使用@OnLifecycleEvent 注解使得該方法具有了生命周期感知能力。括號(hào)里面的參數(shù),表明需要監(jiān)聽(tīng)的是什么生命周期事件。Lifecycle 主要就是通過(guò) EventState 這兩個(gè)枚舉類來(lái)跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)。具體的 Event 和 State 之間的轉(zhuǎn)換關(guān)系,可以參照下圖:

接下來(lái),讓我們的 Activity 繼承自 AppCompatActivity,然后在 onCreate(...) 方法中通過(guò)getLifecycle().addObserver(new MyObserver())完成 Lifecycle 和LifecycleObserver 的綁定。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 就只需要這一行代碼,簡(jiǎn)潔吧
        getLifecycle().addObserver(new MyObserver());
    }
}

然后我們就可以運(yùn)行下程序,跑起來(lái)之后按 Home 鍵或者按返回鍵進(jìn)行操作。能看到,隨著生命周期的變化,MyObserver() 中定義的方法在控制臺(tái)中也被正確地打印了出來(lái)。

是不是覺(jué)得特別簡(jiǎn)單。

但之所以毫不費(fèi)力,是因?yàn)橛腥颂婺恪柏?fù)重前行”。在 support library 26.1.0 及以后的支持庫(kù)中,AppCompatActivity 的祖先類 SupportActivity已經(jīng)默認(rèn)實(shí)現(xiàn)了 LifecycleOwner 接口,通過(guò)其 getLifecycle() 方法可以直接返回一個(gè) Lifecycle 對(duì)象。之后我們就可以通過(guò)該對(duì)象的 addObserver(...) 方法將 Lifecycle 跟指定的 LifecycleObserver 進(jìn)行綁定。

2.2、 方式二:繼承自普通的 Activity

首先,我們?nèi)匀恍枰裆厦娴姆绞?,?lái)創(chuàng)建一個(gè)MyObserver 對(duì)象。

這次我們創(chuàng)建一個(gè)繼承自普通的 Activity 的 Activity ,那自然無(wú)法直接使用 getLifecycle() 方法來(lái)獲取 Lifecycle 。無(wú)法直接使用,那我們能否模仿 AppCompatActivity的實(shí)現(xiàn),來(lái)自己創(chuàng)建 Lifecycle 對(duì)象呢?當(dāng)然可以。這時(shí)候,我們就需要自己實(shí)現(xiàn)LifecycleOwner接口,并在具體的生命周期下通過(guò) LifecycleRegistrymarkState(...)方法來(lái)主動(dòng)進(jìn)行事件的分發(fā)。請(qǐng)看下面改造過(guò)的 MainActivity.java 代碼 :

public class MainActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLifecycleRegistry = new LifecycleRegistry(this);
        getLifecycle().addObserver(new MyObserver());
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

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

然后運(yùn)行代碼,發(fā)現(xiàn)結(jié)果和上面的完全一樣。

可以看到,MainActivity實(shí)現(xiàn)了LifecycleOwner接口(實(shí)現(xiàn)該接口的對(duì)象,即是 Lifecycle 的持有者),并在其 getLifecycle( ) 方法中返回了一個(gè) LifecycleRegistry對(duì)象,而 LifecycleRegistry 是 Lifecycle 的實(shí)現(xiàn)類,能處理多個(gè) Observer,我們自定義 LifecycleOwner的時(shí)候就可以直接使用它。其他使用方式,則完全相同。

為了讓使用更加方便靈活,Lifecycle 還提供了查詢當(dāng)前組件所處的生命周期狀態(tài)的方法:

lifecycle.getCurrentState().isAtLeast(STARTED)
總結(jié)

實(shí)現(xiàn)了 LifecycleObserver 接口的類可以和實(shí)現(xiàn)了 LifecycleOwner 接口的類無(wú)縫工作,因?yàn)?LifecycleOwner 可以提供一個(gè) Lifecycle 對(duì)象,而 LifecycleObserver 就正需要對(duì)這個(gè) Lifecycle 對(duì)象進(jìn)行監(jiān)聽(tīng)呢。

LifecycleOwner 是從特定的類(比如 Activity 或者 Fragment 等)中抽象出來(lái)的Lifecycle 的持有者。

LifecycleRegistry 是 Lifecycle 的實(shí)現(xiàn)類,用于注冊(cè)和反注冊(cè)那些需要監(jiān)聽(tīng)當(dāng)前組件生命周期的 LifecycleObserver

注意

從 1.0.0-rc1 版本的 Lifecycle 包開(kāi)始,當(dāng) Activity 的 onSaveInstanceState() 方法調(diào)用結(jié)束之后,Lifecycle 將立刻被標(biāo)記為 CREATEDON_STOP ,而不是等 onStop() 方法調(diào)用結(jié)束。這點(diǎn)和 API level 26 或者更低版本上 Activity 的生命周期的調(diào)用順序并不匹配,需要稍加注意。有具體需求的可以進(jìn)一步查閱相關(guān)文檔。

更多最新消息,歡迎關(guān)注我的公眾號(hào)獲?。?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77457.html

相關(guān)文章

  • Android 生命周期組件 Lifecycle 使用詳解

    摘要:括號(hào)里面的參數(shù),表明需要監(jiān)聽(tīng)的是什么生命周期事件。主要就是通過(guò)和這兩個(gè)枚舉類來(lái)跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)。這點(diǎn)和或者更低版本上的生命周期的調(diào)用順序并不匹配,需要稍加注意。 前言 2018 年的 Google I/O 大會(huì)上,Google 發(fā)布了 Android Jetpack,并稱其為下一代的 Android 組件,旨在幫助開(kāi)發(fā)者加快應(yīng)用開(kāi)發(fā)速度。準(zhǔn)確來(lái)講,Jetpack 是一系列...

    xuexiangjys 評(píng)論0 收藏0
  • Android lifecyle 源碼解剖

    摘要:使用詳解使用詳解源碼解剖源碼解剖地址技術(shù)人,一位不羈的碼農(nóng)。在中,它默認(rèn)為我們初始化,作為一個(gè)成員變量。在方法中,它會(huì)判斷我們是否已經(jīng)添加,沒(méi)有的話,添加進(jìn)去。說(shuō)在前面 本次推出 Android Architecture Components 系列文章,目前寫(xiě)好了四篇,主要是關(guān)于 lifecycle,livedata 的使用和源碼分析,其余的 Navigation, Paging libr...

    番茄西紅柿 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<