HarmonyOS 页面声明周期解析

在Java 开发模式下,Ability和AbilitySlice 的生命周期

在HarmonyOS中,Ability(类似于Android中的Activity)和AbilitySice(类似于Android中的Fragment)是页面的基本单元,用户操作或系统管理等行为,都会引起页面实例在生命周期的不同状态之间进行切换。Ability类提供的回调机制,能够让页面及时感知外界变化,从而正确的应对状态变化(比如:释放资源)。

页面(Ability)生命周期回调

页面生命周期的不同状态下会有不同的生命周期回调,如下图所示:

  • onstart() :当系统首次创建 Page 实例时,触发该回调。对于一个Page实例,该回调在其生命周期过程中仅触发一次,Page在该逻辑后将进入INACTIVE状态。开发者必须重写该方法,并在此配置默认展示的AbilitySlice (ps:该生命周期函数类似于Android中的onCreate()
@Override
public void onStart(Intent intent) {
    super.onStart(intent);
// 必须重写onStart(),并配置AbilitySlice
    super.setMainRoute(MeAbilitySlice.class.getName());
}
  • onActive():Page会在进入INACTIVE状态后,来到前台,然后系统调用此回调。Page在此之后进入ACTIVE状态,该状态时应用与用户交互的状态。Page将保持在此状态,除非某类事件发生,导致Page失去焦点,例如用户点击了返回键或导航到其它的Page页面,当此类事件发生时,会触发Page回到INACTIVE状态,系统将调用onInactive()回调。此后,Page可能重新回调ACTIVE状态,系统将再次调用onActive()回调。因此,开发者通常需要成对实现 onActive() 和 onInactive() ,并在onActive()中获取onInactive()中释放资源。(ps:其实该声明周期函数就类似于Android中的onResume(),只有当获取焦点的时候才会被调用
  • onInactive():当Page失去焦点时,系统将会调用此回调,此后Page进入INACTIVE状态。开发者可以在此回调中实现Page失去焦点时应表现的恰当行为。(ps:该生命周期函数类似于Android中的onPause()
  • onBackground():如果Page不再对用户可见,系统将通过此回调通知开发者用户进行相应的资源释放,此后Page进入BACKGROUND状态,开发者应该在此回调中释放Page不可见时无用的资源,或在此回调中执行较为耗时的状态保存操作。(ps:有点类似于Android中的onStop()
  • onForeground():处于BACKGROUND状态时的Page仍然驻留在内存中,当重新回调前台时(比如此用户重新导航到此Page),系统将先调用onForeground()回调通知开发者,而后Page的生命周期状态回到INACTIVE状态,开发者应当在此回调中重新申请在onBackground()中释放的资源,最后Page的生命周期状态进一步回到ACTIVE状态,系统将通过onActive()回调通知开发者用户。
  • onStop():系统将要销毁Page时,将会触发此回调函数,通知用户进行系统资源的释放。(ps:该生命周期函数类似于Android中的onDestroy()

AbilitySlice生命周期

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

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

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

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

JS 开发模式下Ability和AbilitySlice的生命周期

在JS开发模式下,主要的生命周期主要由两个:应用创建时调用onCreate()和应用销毁时调用onDestroy()

一个应用中可能有多个页面,一个页面一般包括onInit、onReady、onShow和onDestroy等在页面创建、显示和销毁时会触发调用的事件:

  • onInit:表示页面的数据已经准备好,可以使用js文件中的data数据
  • onReady:表示页面已经编译完成,可以将界面显示给
  • onShow:JS UI 只支持应用同时运行并展示一个页面,当打开一个页面时,上一个页面就销毁了。当一个页面显示的时候,会调用onShow。
  • onHide:页面消失时被调用
  • onDestroy:页面销毁时调用

当应用从页面A跳转到页面B时,首先调用页面A的onDestroy(),页面A消失后,依次调用页面的B的onInit、onReady、onShow函数来初始化和显示页面B

如果觉得文章有帮助到你,可以扫描以下二维码
   请本文作者 喝一杯
pay_weixin pay_weixin

发表评论

电子邮件地址不会被公开。 必填项已用*标注