四华为鸿蒙HarmonyOS应用开发之Java开发下Page Ability生命周期

Posted 皓月盈江

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四华为鸿蒙HarmonyOS应用开发之Java开发下Page Ability生命周期相关的知识,希望对你有一定的参考价值。

系统管理或用户操作等行为均会引起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的可能原因包括以下几个方面:

1.用户通过系统管理能力关闭指定Page,例如使用任务管理器关闭Page。
2.用户行为触发Page的terminateAbility()方法调用,例如使用应用的退出功能。
3.配置变更导致系统暂时销毁Page并重建。
4系统出于资源管理目的,自动触发对处于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,在此期间的生命周期状态变化顺序为:

1.FooAbilitySlice从ACTIVE状态变为INACTIVE状态。
2.BarAbilitySlice则从INITIAL状态首先变为INACTIVE状态,然后变为ACTIVE状态(假定此前BarAbilitySlice未曾启动)。
3FooAbilitySlice从INACTIVE状态变为BACKGROUND状态。

对应两个slice的生命周期方法回调顺序为:

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

在整个流程中,MyAbility始终处于ACTIVE状态。但是,当Page被系统销毁时,其所有已实例化的AbilitySlice将联动销毁,而不仅是处于前台的AbilitySlice。
//==========================================
实例测试:
1.首先按照二、华为鸿蒙开发DevEco Studio运行第一个Hello World工程
创建一个Empty Ablity(java) 的helloword工程,运行出现下面界面:
在这里插入图片描述
2.修改MainAbilitySlice.java文件代码如下面:

package com.example.helloword.slice;

import com.example.helloword.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;

public class MainAbilitySlice extends AbilitySlice {

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        log("onStart");
        super.setUIContent(ResourceTable.Layout_ability_main);
    }

    private void log(String log){

        System.out.println("------log:"+log);
    }

    @Override
    public void onActive() {
        super.onActive();
        log("onActive");
    }

    @Override
    public void onInactive(){
        super.onInactive();
        log("onInactive");
    }

    @Override
    public void onBackground(){
        super.onBackground();
        log("onBackground");
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
        log("onForeground");
    }

    @Override
    public void onStop(){
        super.onStop();
        log("onStop");
    }
}

3.按照下面设置并运行工程,看到下面HiLog窗口现象:
在这里插入图片描述

07-08 22:25:31.575 15167-15167/com.example.helloword I System.out: ------log:onStart
07-08 22:25:31.615 15167-15167/com.example.helloword I System.out: ------log:onActive

4.按照下图,鼠标单击“返回”,再次看到HiLog窗口现象:
在这里插入图片描述

07-08 22:25:31.575 15167-15167/com.example.helloword I System.out: ------log:onStart
07-08 22:25:31.615 15167-15167/com.example.helloword I System.out: ------log:onActive
07-08 22:26:18.823 15167-15167/com.example.helloword I System.out: ------log:onInactive
07-08 22:26:20.103 15167-15167/com.example.helloword I System.out: ------log:onBackground
07-08 22:26:20.106 15167-15167/com.example.helloword I System.out: ------log:onStop

欢迎关注公众号,方便技术交流
在这里插入图片描述

以上是关于四华为鸿蒙HarmonyOS应用开发之Java开发下Page Ability生命周期的主要内容,如果未能解决你的问题,请参考以下文章

八华为鸿蒙HarmonyOS应用开发之Java UI框架常用TextField组件使用

六华为鸿蒙HarmonyOS应用开发之Java开发模式下的不同Page 间实现页面跳转

七华为鸿蒙HarmonyOS应用开发之Java UI框架常用Text组件和Button组件使用

硬嗑HarmonyOS开篇之Linux内核

《HarmonyOS实战——前端开发华为鸿蒙系统应用 OpenHarmony JS》

《HarmonyOS实战——前端开发华为鸿蒙系统应用 OpenHarmony JS》