鴻蒙OS 生命周期

2020-09-18 09:50 更新

系統(tǒng)管理或用戶操作等行為均會(huì)引起 Page 實(shí)例在其生命周期的不同狀態(tài)之間進(jìn)行轉(zhuǎn)換。Ability 類提供的回調(diào)機(jī)制能夠讓 Page 及時(shí)感知外界變化,從而正確地應(yīng)對(duì)狀態(tài)變化(比如釋放資源),這有助于提升應(yīng)用的性能和穩(wěn)健性。

Page 生命周期回調(diào)

Page 生命周期的不同狀態(tài)轉(zhuǎn)換及其對(duì)應(yīng)的回調(diào),如圖1所示。

圖1 Page 生命周期 點(diǎn)擊放大

  • onStart()

當(dāng)系統(tǒng)首次創(chuàng)建 Page 實(shí)例時(shí),觸發(fā)該回調(diào)。對(duì)于一個(gè) Page 實(shí)例,該回調(diào)在其生命周期過程中僅觸發(fā)一次, Page 在該邏輯后將進(jìn)入 INACTIVE 狀態(tài)。開發(fā)者必須重寫該方法,并在此配置默認(rèn)展示的 AbilitySlice。

      @Override
      public void onStart(Intent intent) {
          super.onStart(intent);
          super.setMainRoute(FooSlice.class.getName());
      }

  • onActive()

Page 會(huì)在進(jìn)入 INACTIVE 狀態(tài)后來到前臺(tái),然后系統(tǒng)調(diào)用此回調(diào)。Page 在此之后進(jìn)入 ACTIVE 狀態(tài),該狀態(tài)是應(yīng)用與用戶交互的狀態(tài)。Page 將保持在此狀態(tài),除非某類事件發(fā)生導(dǎo)致 Page 失去焦點(diǎn),比如用戶點(diǎn)擊返回鍵或?qū)Ш降狡渌?Page。當(dāng)此類事件發(fā)生時(shí),會(huì)觸發(fā) Page 回到 INACTIVE 狀態(tài),系統(tǒng)將調(diào)用 onInactive() 回調(diào)。此后,Page 可能重新回到 ACTIVE 狀態(tài),系統(tǒng)將再次調(diào)用 onActive() 回調(diào)。因此,開發(fā)者通常需要成對(duì)實(shí)現(xiàn) onActive()和 onInactive(),并在 onActive() 中獲取在 onInactive() 中被釋放的資源。

  • onInactive()

當(dāng) Page 失去焦點(diǎn)時(shí),系統(tǒng)將調(diào)用此回調(diào),此后 Page 進(jìn)入 INACTIVE 狀態(tài)。開發(fā)者可以在此回調(diào)中實(shí)現(xiàn) Page 失去焦點(diǎn)時(shí)應(yīng)表現(xiàn)的恰當(dāng)行為。

  • onBackground()

如果 Page 不再對(duì)用戶可見,系統(tǒng)將調(diào)用此回調(diào)通知開發(fā)者用戶進(jìn)行相應(yīng)的資源釋放,此后 Page 進(jìn)入 BACKGROUND 狀態(tài)。開發(fā)者應(yīng)該在此回調(diào)中釋放 Page 不可見時(shí)無用的資源,或在此回調(diào)中執(zhí)行較為耗時(shí)的狀態(tài)保存操作。

  • onForeground()

處于 BACKGROUND 狀態(tài)的 Page 仍然駐留在內(nèi)存中,當(dāng)重新回到前臺(tái)時(shí)(比如用戶重新導(dǎo)航到此 Page ),系統(tǒng)將先調(diào)用 onForeground() 回調(diào)通知開發(fā)者,而后 Page 的生命周期狀態(tài)回到 INACTIVE 狀態(tài)。開發(fā)者應(yīng)當(dāng)在此回調(diào)中重新申請(qǐng)?jiān)?onBackground() 中釋放的資源,最后 Page 的生命周期狀態(tài)進(jìn)一步回到 ACTIVE 狀態(tài),系統(tǒng)將通過 onActive() 回調(diào)通知開發(fā)者用戶。

  • onStop()

系統(tǒng)將要銷毀 Page 時(shí),將會(huì)觸發(fā)此回調(diào)函數(shù),通知用戶進(jìn)行系統(tǒng)資源的釋放。銷毀 Page 的可能原因包括以下幾個(gè)方面:

  • 用戶通過系統(tǒng)管理能力關(guān)閉指定 Page,例如使用任務(wù)管理器關(guān)閉 Page。
  • 用戶行為觸發(fā) Page 的 terminateAbility() 方法調(diào)用,例如使用應(yīng)用的退出功能。
  • 配置變更導(dǎo)致系統(tǒng)暫時(shí)銷毀 Page 并重建。
  • 系統(tǒng)出于資源管理目的,自動(dòng)觸發(fā)對(duì)處于 BACKGROUND 狀態(tài) Page 的銷毀。

AbilitySlice生命周期

AbilitySlice 作為 Page 的組成單元,其生命周期是依托于其所屬 Page 生命周期的。AbilitySlice 和 Page 具有相同的生命周期狀態(tài)和同名的回調(diào),當(dāng) Page 生命周期發(fā)生變化時(shí),它的 AbilitySlice 也會(huì)發(fā)生相同的生命周期變化。此外, AbilitySlice 還具有獨(dú)立于 Page 的生命周期變化,這發(fā)生在同一 Page 中的 AbilitySlice 之間導(dǎo)航時(shí),此時(shí) Page 的生命周期狀態(tài)不會(huì)改變。

AbilitySlice 生命周期回調(diào)與 Page 的相應(yīng)回調(diào)類似,因此不再贅述。由于 AbilitySlice 承載具體的頁面,開發(fā)者必須重寫 AbilitySlice 的 onStart() 回調(diào),并在此方法中通過 setUIContent() 方法設(shè)置頁面,如下所示:

    @Override
    protected void onStart(Intent intent) {
        super.onStart(intent);

 
        setUIContent(ResourceTable.Layout_main_layout);
    }

AbilitySlice 實(shí)例創(chuàng)建和管理通常由應(yīng)用負(fù)責(zé),系統(tǒng)僅在特定情況下會(huì)創(chuàng)建 AbilitySlice 實(shí)例。例如,通過導(dǎo)航啟動(dòng)某個(gè) AbilitySlice 時(shí),是由系統(tǒng)負(fù)責(zé)實(shí)例化;但是在同一個(gè) Page 中不同的 AbilitySlice 間導(dǎo)航時(shí)則由應(yīng)用負(fù)責(zé)實(shí)例化。

Page 與 AbilitySlice 生命周期關(guān)聯(lián)

當(dāng) AbilitySlice 處于前臺(tái)且具有焦點(diǎn)時(shí),其生命周期狀態(tài)隨著所屬 Page 的生命周期狀態(tài)的變化而變化。當(dāng)一個(gè) Page 擁有多個(gè) AbilitySlice 時(shí),例如:MyAbility 下有 FooAbilitySlice 和 BarAbilitySlice,當(dāng)前 FooAbilitySlice 處于前臺(tái)并獲得焦點(diǎn),并即將導(dǎo)航到 BarAbilitySlice,在此期間的生命周期狀態(tài)變化順序?yàn)椋?/p>

  1. FooAbilitySlice 從 ACTIVE 狀態(tài)變?yōu)?INACTIVE 狀態(tài)。
  2. BarAbilitySlice 則從 INITIAL 狀態(tài)首先變?yōu)?INACTIVE 狀態(tài),然后變?yōu)?ACTIVE 狀態(tài)(假定此前 BarAbilitySlice 未曾啟動(dòng))。
  3. FooAbilitySlice 從 INACTIVE 狀態(tài)變?yōu)?BACKGROUND 狀態(tài)。

對(duì)應(yīng)兩個(gè) slice 的生命周期方法回調(diào)順序?yàn)椋?/p>

FooAbilitySlice.onInactive() --> BarAbilitySlice.onStart() --> BarAbilitySlice.onActive() --> FooAbilitySlice.onBackground()

在整個(gè)流程中,MyAbility 始終處于 ACTIVE 狀態(tài)。但是,當(dāng) Page 被系統(tǒng)銷毀時(shí),其所有已實(shí)例化的 AbilitySlice 將聯(lián)動(dòng)銷毀,而不僅是處于前臺(tái)的AbilitySlice。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)