Harmony生命周期
Harmony生命周期
系統管理或用戶操作等行為,均會引起Page實例在其生命周期的不同狀態之間進行轉換。Ability類提供的回調機制能夠讓Page及時感知外界變化,從而正確地應對狀態變化(比如釋放資源),這有助于提升應用的性能和穩健性。
Page生命周期回調
Page生命周期的不同狀態轉換及其對應的回調,如圖1所示。
圖1 Page生命周期
? onStart()
當系統首次創建Page實例時,觸發該回調。對于一個Page實例,該回調在其生命周期過程中僅觸發一次,Page在該邏輯后將進入INACTIVE狀態。開發者必須重寫該方法,并在此配置默認展示的AbilitySlice。
-
@Override -
public void onStart(Intent intent) { -
super.onStart(intent); -
super.setMainRoute(FooSlice.class.getName()); -
}
? onActive()
Page會在進入INACTIVE狀態后來到前臺,然后系統調用此回調。Page在此之后進入ACTIVE狀態,該狀態是應用與用戶交互的狀態。Page將保持在此狀態,除非某類事件發生導致Page失去焦點,比如用戶點擊返回鍵或導航到其他Page。當此類事件發生時,會觸發Page回到INACTIVE狀態,系統將調用onInactive()回調。此后,Page可能重新回到ACTIVE狀態,系統將再次調用onActive()回調。因此,開發者通常需要成對實現onActive()和onInactive(),并在onActive()中獲取在onInactive()中被釋放的資源。
? onInactive()
當Page失去焦點時,系統將調用此回調,此后Page進入INACTIVE狀態。開發者可以在此回調中實現Page失去焦點時應表現的恰當行為。
? onBackground()
如果Page不再對用戶可見,系統將調用此回調,通知開發者用戶進行相應的資源釋放,此后Page進入BACKGROUND狀態。開發者應該在此回調中釋放Page不可見時無用的資源,或在此回調中執行較為耗時的狀態保存操作。
? onForeground()
處于BACKGROUND狀態的Page仍然駐留在內存中,當重新回到前臺時(比如用戶重新導航到此Page),系統將先調用onForeground()回調通知開發者,而后Page的生命周期狀態回到INACTIVE狀態。開發者應當在此回調中重新申請在onBackground()中釋放的資源,最后Page的生命周期狀態進一步回到ACTIVE狀態,系統將通過onActive()回調通知開發者用戶。
? onStop()
系統將要銷毀Page時,將會觸發此回調函數,通知用戶進行系統資源的釋放。銷毀Page的可能原因包括以下幾個方面:
? 用戶通過系統管理能力關閉指定Page,例如使用任務管理器關閉Page。
? 用戶行為觸發Page的terminateAbility()方法調用,例如使用應用的退出功能。
? 配置變更導致系統暫時銷毀Page并重建。
? 系統出于資源管理目的,自動觸發對處于BACKGROUND狀態Page的銷毀。
AbilitySlice生命周期
AbilitySlice作為Page的組成單元,其生命周期是依托于其所屬Page生命周期的。AbilitySlice和Page具有相同的生命周期狀態和同名的回調,當Page生命周期發生變化時,它的AbilitySlice也會發生相同的生命周期變化。此外,AbilitySlice還具有獨立于Page的生命周期變化,這發生在同一Page中的AbilitySlice之間導航時,此時Page的生命周期狀態不會改變。
AbilitySlice生命周期回調與Page的相應回調類似,因此不再贅述。由于AbilitySlice承載具體的頁面,開發者必須重寫AbilitySlice的onStart()回調,并在此方法中通過setUIContent()方法設置頁面,如下所示:
-
@Override -
protected void onStart(Intent intent) { -
super.onStart(intent); -
setUIContent(ResourceTable.Layout_main_layout); -
}
AbilitySlice實例創建和管理通常由應用負責,系統僅在特定情況下會創建AbilitySlice實例。例如,通過導航啟動某個AbilitySlice時,是由系統負責實例化;但是在同一個Page中不同的AbilitySlice間導航時,則由應用負責實例化。
Page與AbilitySlice生命周期關聯
當AbilitySlice處于前臺且具有焦點時,其生命周期狀態隨著所屬Page的生命周期狀態的變化而變化。當一個Page擁有多個AbilitySlice時,例如:MyAbility下有FooAbilitySlice和BarAbilitySlice,當前FooAbilitySlice處于前臺并獲得焦點,并即將導航到BarAbilitySlice,在此期間的生命周期狀態變化順序為:
- FooAbilitySlice從ACTIVE狀態變為INACTIVE狀態。
- BarAbilitySlice則從INITIAL狀態首先變為INACTIVE狀態,然后變為ACTIVE狀態(假定此前BarAbilitySlice未曾啟動)。
- FooAbilitySlice從INACTIVE狀態變為BACKGROUND狀態。
對應兩個slice的生命周期方法回調順序為:
FooAbilitySlice.onInactive() --> BarAbilitySlice.onStart() --> BarAbilitySlice.onActive() --> FooAbilitySlice.onBackground()
在整個流程中,MyAbility始終處于ACTIVE狀態。但是,當Page被系統銷毀時,其所有已實例化的AbilitySlice將聯動銷毀,而不僅是處于前臺的AbilitySlice。
總結
以上是生活随笔為你收集整理的Harmony生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HarmonyOS技术特性
- 下一篇: 立体显示与BCN双稳态手性向列相