『HarmonyOS』Page与AbilitySlice的生命周期.md

简介: 系统管理或用户操作等行为均会引起Page实例在其生命周期的不同状态之间进行转换。Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放资源),这有助于提升应用的性能和稳健性。


系统管理或用户操作等行为均会引起Page实例在其生命周期的不同状态之间进行转换。Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放资源),这有助于提升应用的性能和稳健性。

生命周期(百度百科)

生命周期就是指一个对象的生老病死。

生命周期(Life Cycle)的概念应用很广泛,特别是在政治、经济、环境、技术、社会等诸多领域经常出现,其基本涵义可以通俗地理解为“从摇篮到坟墓”(Cradle-to-Grave)的整个过程。对于某个产品而言,就是从自然中来回到自然中去的全过程,也就是既包括制造产品所需要的原材料的采集、加工等生产过程,也包括产品贮存、运输等流通过程,还包括产品的使用过程以及产品报废或处置等废弃回到自然过程,这个过程构成了一个完整的产品的生命周期。


1.Page的生命周期

Page Ability是主要负责页面交互的,所以Page有几个状态:可见,可交互,不可见,销毁等等。每一个状态,都有一个生命周期函数和它对应。Page生命周期的不同状态转换及其对应的回调如下图所示:

网络异常,图片无法展示
|

1.onStart()

当系统首次创建Page实例时,触发该回调。对于一个Page实例,该回调在其生命周期过程中仅触发一次,Page在该逻辑后将进入INACTIVE状态。开发者必须重写该方法,并在此配置默认展示的AbilitySlice。

@Override

publicvoidonStart(Intentintent) {

   super.onStart(intent);

   super.setMainRoute(MainAbilitySlice.class.getName());

}

2.onActive()

Page会在进入INACTIVE状态后来到前台,然后系统调用此回调。Page在此之后进入ACTIVE状态,该状态是应用与用户交互的状态Page将保持在此状态,除非某类事件发生导致Page失去焦点,比如用户点击返回键或导航到其他Page。当此类事件发生时,会触发Page回到INACTIVE状态,系统将调用onInactive()回调。此后,Page可能重新回到ACTIVE状态,系统将再次调用onActive()回调。因此,开发者通常需要成对实现onActive()和onInactive(),并在onActive()中获取在onInactive()中被释放的资源。

3.onInactive()当Page失去焦点时,系统将调用此回调,此后Page进入INACTIVE状态。开发者可以在此回调中实现Page失去焦点时应表现的恰当行为。

4.onBackground()如果Page不再对用户可见,系统将调用此回调通知开发者用户进行相应的资源释放,此后Page进入BACKGROUND状态。开发者应该在此回调中释放Page不可见时无用的资源,或在此回调中执行较为耗时的状态保存操作。

5.onForeground()处于BACKGROUND状态的Page仍然驻留在内存中,当重新回到前台时(重新导航到此Page),系统将先调用onForeground()回调通知开发者,而后Page的生命周期状态回到INACTIVE状态。开发者应当在此回调中重新申请在onBackground()中释放的资源,最后Page的生命周期状态进一步回到ACTIVE状态,系统将通过onActive()回调通知开发者用户。

6.onStop()

系统将要销毁Page时,将会触发此回调函数,通知用户进行系统资源的释放。销毁Page的可能原因包括以下几个方面:

  • 用户通过系统管理能力关闭指定Page,例如使用任务管理器关闭Page。
  • 用户行为触发Page的terminateAbility()方法调用,例如使用应用的退出功能。
  • 配置变更导致系统暂时销毁Page并重建。
  • 系统出于资源管理目的,自动触发对处于BACKGROUND状态Page的销毁。

2.AbilitySlice生命周期

AbilitySlice作为Page的组成单元,其生命周期是依托于其所属Page生命周期的AbilitySlice和Page具有相同的生命周期状态和同名的回调,当Page生命周期发生变化时,它的AbilitySlice也会发生相同的生命周期变化。此外,AbilitySlice还具有独立于Page的生命周期变化,这发生在同一Page中的AbilitySlice之间导航时,此时Page的生命周期状态不会改变。

AbilitySlice生命周期回调与Page的相应回调类似,因此不再赘述。由于AbilitySlice承载具体的页面,开发者必须重写AbilitySlice的onStart()回调,并在此方法中通过setUIContent()方法设置页面,如下所示:

   @Override

   protectedvoidonStart(Intentintent) {

       super.onStart(intent);

 

       setUIContent(ResourceTable.Layout_main_layout);

   }

AbilitySlice实例创建和管理通常由应用负责,系统仅在特定情况下会创建AbilitySlice实例。例如,通过导航启动某个AbilitySlice时,是由系统负责实例化;但是在同一个Page中不同的AbilitySlice间导航时则由应用负责实例化。

3.Page与AbilitySlice生命周期关联

当AbilitySlice处于前台且具有焦点时,其生命周期状态随着所属Page的生命周期状态的变化而变化。

当一个Page拥有多个AbilitySlice时,例如:MyAbility下有FooAbilitySlice和BarAbilitySlice,当前FooAbilitySlice处于前台并获得焦点,并即将导航到BarAbilitySlice,在此期间的生命周期状态变化顺序为:

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

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

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

在整个流程中,MyAbility始终处于ACTIVE状态。但是,当Page被系统销毁时,其所有已实例化的AbilitySlice将联动销毁,而不仅是处于前台的AbilitySlice。

4.Page与AbilitySlice生命周期的例子

为了更好地理解Page与AbilitySlice的生命周期,我们将创建一个PageAndAbilitySliceLifeCycle的应用作为演示。

此应用中包含两个Slice,MainAbilitySlicePayAbilitySlice分别代表主页界面和支付界面

我们运行项目首先创建主页界面,主页界面的onStart()onActive()方法分别调用,MainAbilitySlice处于与用户交互的状态

网络异常,图片无法展示
|

用户点击跳转到支付界面,首先MainAbilitySlice界面失去焦点,进入onInactive()状态;马上创建了一个PayAbilitySlice界面,onStart()方法被调用,紧接着PayAbilitySlice进入onActive()状态,此时用户可见的是支付界面,而MainAbilitySlice调用onBackground()方法,此Slice不再对用户可见,通知开发者释放资源

网络异常,图片无法展示
|

在这个demo中,系统没有销毁MainAbilitySlice,而是将其存入幕后不再让用户可见,因为我们可以看到日志台并没有打印onStop()方法;也就是说我们每点击一次跳转,就创建一个新的Slice(调用onStart()方法)。

网络异常,图片无法展示
|

这一次我们不点击跳转了,而是点击虚拟机上的返回按键,可以看到这一次打印了五条日志。首先PayAbilitySlice失去焦点,进入onInactive状态,而MainAbilitySlice从后台资源中重新回到前台,(这里也再次证明了我们的MainAbilitySlice是没有被销毁的)然后就如用户可见的onActive状态;而用户不可见的PayAbilitySlice调用onBackground方法进入后台资源中,最终被onStop()方法销毁,至此PayAbilitySlice度过了它的一个生命周期

5.MainAbilitySlice

packagecom.hnucm.hmos0501_pageandabilityslicelifecycle.slice;

 

importcom.hnucm.hmos0501_pageandabilityslicelifecycle.ResourceTable;

importohos.aafwk.ability.AbilitySlice;

importohos.aafwk.content.Intent;

importohos.agp.components.Button;

importohos.hiviewdfx.HiLog;

importohos.hiviewdfx.HiLogLabel;

 

publicclassMainAbilitySliceextendsAbilitySlice {

 

   staticfinalHiLogLabellabel=newHiLogLabel(HiLog.LOG_APP, 0x00201, "MainAbilitySlice"); //MY_MODULE=0x00201

   @Override

   publicvoidonStart(Intentintent) {

 

       HiLog.info(label, "MainAbilitySlice---->onStart");

       super.onStart(intent);

       super.setUIContent(ResourceTable.Layout_ability_main);

       ButtontoPayBtn=findComponentById(ResourceTable.Id_toPayBtn);

       toPayBtn.setClickedListener(listener->present(newPayAbilitySlice(),newIntent()));

   }

 

   @Override

   protectedvoidonInactive() {

       super.onInactive();

       HiLog.info(label, "MainAbilitySlice---->onInactive");

   }

 

   @Override

   protectedvoidonBackground() {

       super.onBackground();

 

       HiLog.info(label, "MainAbilitySlice---->onBackground");

 

   }

 

   @Override

   protectedvoidonStop() {

       super.onStop();

       HiLog.info(label, "MainAbilitySlice---->onStop");

 

   }

 

   @Override

   publicvoidonActive() {

       super.onActive();

       HiLog.info(label,  "MainAbilitySlice---->onActive");

   }

   @Override

   publicvoidonForeground(Intentintent) {

       super.onForeground(intent);

       HiLog.info(label, "MainAbilitySlice---->onForeground");

   }

}

 

6.PayAbilitySlice

packagecom.hnucm.hmos0501_pageandabilityslicelifecycle.slice;

 

importcom.hnucm.hmos0501_pageandabilityslicelifecycle.ResourceTable;

importohos.aafwk.ability.AbilitySlice;

importohos.aafwk.content.Intent;

importohos.agp.components.Button;

importohos.hiviewdfx.HiLog;

importohos.hiviewdfx.HiLogLabel;

 

publicclassPayAbilitySliceextendsAbilitySlice {

 

   staticfinalHiLogLabellabel=newHiLogLabel(HiLog.LOG_APP, 0x00201, "PayAbilitySlice"); //MY_MODULE=0x00201

 

   @Override

   publicvoidonStart(Intentintent) {

 

       super.onStart(intent);

       super.setUIContent(ResourceTable.Layout_ability_pay);

 

       HiLog.info(label, "PayAbilitySlice---->onStart");

 

 

       ButtonbackMainBtn=findComponentById(ResourceTable.Id_backMainBtn);

       backMainBtn.setClickedListener(listener->present(newMainAbilitySlice(),newIntent()));

   }

 

   @Override

   publicvoidonActive() {

       super.onActive();

       HiLog.info(label, "PayAbilitySlice---->onActive");

 

   }

 

   @Override

   protectedvoidonInactive() {

       super.onInactive();

       HiLog.info(label, "PayAbilitySlice---->onInactive");

 

   }

 

   @Override

   protectedvoidonBackground() {

       super.onBackground();

       HiLog.info(label, "PayAbilitySlice---->onBackground");

 

 

   }

 

   @Override

   protectedvoidonStop() {

       super.onStop();

       HiLog.info(label, "PayAbilitySlice---->onStop");

 

   }

 

   @Override

   publicvoidonForeground(Intentintent) {

       super.onForeground(intent);

       HiLog.info(label, "PayAbilitySlice---->onForeground");

 

   }

}

 


相关文章
|
19天前
|
存储 监控 安全
开发者的黄金时代:原生鸿蒙应用市场的全生命周期服务
2024年10月22日,华为发布了HarmonyOS NEXT,标志着鸿蒙生态进入商用发展阶段。原生鸿蒙应用市场全面焕新,不仅在UI设计、互动体验和隐私安全机制上进行了重塑,还为开发者和用户提供了从开发到分发的全生命周期服务。通过统一上架、多端分发、隐私合规保障等措施,原生鸿蒙应用市场助力开发者实现高效、安全的应用开发与分发,为全球数亿鸿蒙用户带来更流畅、更安全的使用体验。
|
6月前
|
调度 UED 开发者
【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式
【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式
867 0
【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式
HarmonyOS学习路之开发篇——Page Ability
Page与AbilitySlice Page模板(以下简称“Page”)是FA唯一支持的模板,用于提供与用户交互的能力。一个Page可以由一个或多个AbilitySlice构成,AbilitySlice是指应用的单个页面及其控制逻辑的总和。
|
XML 数据格式
【HarmonyOS】【DevEco Studio】NOTE05:PageAbility生命周期的呈现
【HarmonyOS】【DevEco Studio】NOTE05:PageAbility生命周期的呈现
131 1
【HarmonyOS】【DevEco Studio】NOTE05:PageAbility生命周期的呈现
harmonyOS:关于AbilitySlice生命周期详解✨一文搞懂✨
文章目录 前言 一.AbilitySlice概述 二.AbilitySlice生命周期 1.准备工作 1.MainAbilitySlice配置 2.MainAbility2Slice配置 3.跳转的实现 2.运行时的状态 总结
harmonyOS:关于AbilitySlice生命周期详解✨一文搞懂✨
|
开发者
harmonyOS:关于Page Ability生命周期详解✨一文搞懂✨
文章目录 前言 一.Ability概述 二.Page Ability生命周期 1.准备工作 2.一阶段运行程序时 3.二阶段ACTIVE的状态 3.三阶段 4.四阶段 5.五阶段onStop()方法 总结
harmonyOS:关于Page Ability生命周期详解✨一文搞懂✨
|
存储 缓存 Java
鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
1177 0
鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(三)
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(三)
274 0
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(三)
|
Java
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(二)
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(二)
144 0
【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )(二)
|
5天前
|
Android开发
鸿蒙开发:自定义一个简单的标题栏
本身就是一个很简单的标题栏组件,没有什么过多的技术含量,有一点需要注意,当使用沉浸式的时候,注意标题栏的位置,需要避让状态栏。
鸿蒙开发:自定义一个简单的标题栏