HarmonyOS Ability的生命周期

Ability的生命周期

Ability的生命周期方法有以下6个方法

 1. onCreate(want, launchParam) 
 2. onDestroy()
 3. onWindowStageCreate(windowStage: window.WindowStage)
 4. onWindowStageDestroy()
 5. onForeground()
 6. onBackground()

现结合Ability的启动模式来分析下Ability的生命周期

.singleton模式启动【系统默认启动模式】

创建Helloworld 项目 启动app 看到如下日志

01-25 14:58:41.215 1836-4949/? I 00000/testTag: Ability onCreate
01-25 14:58:41.459 1836-4949/? I 00000/testTag: Ability onWindowStageCreate
01-25 14:58:41.813 1836-4949/? I 00000/testTag: Ability onForeground

日志分析:可以看到Ability 创建然后windowStage 创建并加载页面
按下home键页面退到后台日志如下

01-25 15:07:31.227 3568-5463/com.wy.myapplication I 00000/testTag: Ability onBackground

点击app图标或者从任务列表中重新进入日志如下

01-25 15:08:42.967 3568-5463/com.wy.myapplication I 00000/testTag: Ability onForeground

应用重新进入前台

点击返回按钮

01-25 15:12:49.350 3568-5463/? I 00000/testTag: Ability onBackground
01-25 15:12:49.419 3568-5463/? I 00000/testTag: Ability onWindowStageDestroy
01-25 15:12:49.419 3568-5463/? I 00000/testTag: Ability onDestroy

小结singleton 这种启动模式只会创建一次实例。

.multiton模式启动

创建Helloworld 在entry model 下添新建一个secondAbility 指定启动模式为multiton 。点击text 启动SecondAbility

...
"abilities": [
      {...
"launchType": "multiton"
	  ....}
...

日志如下

01-25 15:57:09.538 15095-8453/? I 00000/MTEST: SecondAbility Ability onCreate
01-25 15:57:09.599 15095-8453/? I 00000/MTEST: SecondAbility Ability onWindowStageCreate
01-25 15:57:09.884 15095-8453/? I 00000/MTEST: SecondAbility Ability onForeground

可以看到SecondAbility 启动成功加载页面。这是如果按下menu 键再次回到entryAbility 的index页面 再次点击text 启动SecondAbility ,日志如下

01-25 16:03:37.805 17408-8977/? I 00000/MTEST: SecondAbility Ability onBackground
01-25 16:03:44.696 17408-8977/? I 00000/MTEST: SecondAbility Ability onCreate
01-25 16:03:45.744 17408-8977/? I 00000/MTEST: SecondAbility Ability onWindowStageCreate
01-25 16:03:46.783 17408-8977/? I 00000/MTEST: SecondAbility Ability onForeground

可以看到SecondAbility 先进入后台然后又重新创建了新的SecondAbility
此时点开任务类别看到又两个历史任务,一个是EntryAbility另一个是SecondAbility 如果所示在这里插入图片描述

.standard模式启动

将SecondAbility 的启动模式指定为standard

...
"abilities": [
      {...
"launchType": "standard"
	  ....}
...

打开Index页面 点击Text 启动SecondAbility
然后通过任务列表回到EntryAbility 再次点击Text 启动SecondAbility
可以看到如下日志

01-25 16:17:39.272 21167-9795/? I 00000/MTEST: SecondAbility Ability onCreate
01-25 16:17:39.360 21167-9795/? I 00000/MTEST: SecondAbility Ability onWindowStageCreate
01-25 16:17:39.670 21167-9795/? I 00000/MTEST: SecondAbility Ability onForeground
01-25 16:17:42.156 21167-9795/? I 00000/MTEST: SecondAbility Ability onBackground
01-25 16:17:51.231 21167-9795/? I 00000/MTEST: SecondAbility Ability onCreate
01-25 16:17:51.269 21167-9795/? I 00000/MTEST: SecondAbility Ability onWindowStageCreate
01-25 16:17:51.682 21167-9795/? I 00000/MTEST: SecondAbility Ability onForeground

SecondAbility 被多次启动 在任务列表里看到多个SecondAbility 的历史任务。如图所示在这里插入图片描述

.specified模式启动

这种指定特定的启动模式需要创建id
在index的text 里面通过want 指定id

let want: Want = {
    deviceId: '',
    bundleName: 'com.wy.myapplication',
    abilityName: 'SecondAbility',
    moduleName: 'entry',
    parameters: {
    instanceKey:'id_2'
    }
}
this.context.startAbility(want)//启动ability

Ability需要依赖AbilityStage
创建MAbilityStage

import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';

export default class MAbilityStage extends AbilityStage {
  onAcceptWant(want: Want): string {
    if (want.abilityName === 'SecondAbility') {
      return `AbilityId_${want.parameters.instanceKey}`
    }
    return ''
  }
}

此外还需要再model.json5中配置

"module": {
    "name": "entry",
    "type": "entry",
    "srcEntry": './ets/abilitystage/MAbilityStage.ts',
    "description": "$string:module_desc",
    ...}

点击Text1 去第一个SecondAbility
点击Text2 去第二个SecondAbility
多次点击后不会在创建新的SecondAbility
只会启动在任务列表里已经存在的id相同的Ability
如图所示
在这里插入图片描述

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值