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
如图所示