Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
16cf6f34
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
16cf6f34
编写于
3月 02, 2023
作者:
zyjhandsome
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
重构UIAbility指定实例模式的内容
Signed-off-by:
zyjhandsome
<
zyjhandsome@126.com
>
上级
da66229b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
23 addition
and
28 deletion
+23
-28
zh-cn/application-dev/application-models/uiability-launch-type.md
...plication-dev/application-models/uiability-launch-type.md
+23
-28
未找到文件。
zh-cn/application-dev/application-models/uiability-launch-type.md
浏览文件 @
16cf6f34
...
...
@@ -17,8 +17,7 @@ singleton启动模式为单实例模式,也是默认情况下的启动模式
每次调用
[
startAbility()
](
../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability
)
方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。
**图1**
单实例模式演示效果
**图1**
单实例模式演示效果

> **说明**:应用的UIAbility实例已创建,该UIAbility配置为单实例模式,再次调用[startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability)方法启动该UIAbility实例。由于启动的还是原来的UIAbility实例,并未重新创建一个新的UIAbility实例,此时只会进入该UIAbility的[onNewWant()](../reference/apis/js-apis-app-ability-uiAbility.md#abilityonnewwant)回调,不会进入其[onCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate)和[onWindowStageCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate)生命周期回调。
...
...
@@ -45,8 +44,7 @@ singleton启动模式为单实例模式,也是默认情况下的启动模式
standard启动模式为标准实例模式,每次调用
[
startAbility()
](
../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability
)
方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。这种情况下可以将UIAbility配置为standard(标准实例模式)。
**图2**
标准实例模式演示效果
**图2**
标准实例模式演示效果

standard启动模式的开发使用,在
[
module.json5配置文件
](
../quick-start/module-configuration-file.md
)
中的
`launchType`
字段配置为
`standard`
即可。
...
...
@@ -71,14 +69,13 @@ standard启动模式的开发使用,在[module.json5配置文件](../quick-sta
specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
**图3**
指定实例模式演示效果
**图3**
指定实例模式演示效果

例如有两个UIAbility:EntryAbility和SpecifiedAbility,SpecifiedAbility配置为
specified启动模式
,需要从EntryAbility的页面中启动SpecifiedAbility。
例如有两个UIAbility:EntryAbility和SpecifiedAbility,SpecifiedAbility配置为
指定实例模式启动
,需要从EntryAbility的页面中启动SpecifiedAbility。
1.
在SpecifiedAbility中,将
[
module.json5配置文件
](
../quick-start/module-configuration-file.md
)
的
`launchType`
字段配置为
`specified`
。
```
json
{
"module"
:
{
...
...
@@ -93,9 +90,8 @@ specified启动模式为指定实例模式,针对一些特殊场景使用(
}
```
2.
在UIAbility实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的UIAbility实例绑定Key之后,后续每次调用
[
startAbility()
](
../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability
)
方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应
[
startAbility()
](
../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability
)
请求。
在EntryAbility中,调用
[
startAbility()
](
../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability
)
方法时,在
[
want参数
](
want-overview.md
)
中,增加一个自定义参数来区别UIAbility实例,例如增加一个
`instanceKey`
自定义参数。
2.
在创建UIAbility实例之前,开发者可以为该实例指定一个唯一的字符串Key,这样在调用
[
startAbility()
](
.../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability
)
方法时,应用就可以根据指定的Key来识别响应请求的UIAbility实例。在EntryAbility中,调用
[
startAbility()
](
.../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability
)
方法时,可以在
`want`
参数中增加一个自定义参数,例如
`instanceKey`
,以此来区分不同的UIAbility实例。
```
ts
// 在启动指定实例模式的UIAbility时,给每一个UIAbility实例配置一个独立的Key标识
// 例如在文档使用场景中,可以用文档路径作为Key标识
...
...
@@ -119,10 +115,11 @@ specified启动模式为指定实例模式,针对一些特殊场景使用(
// ...
})
```
3.
运行时由UIAbility内部业务决定是否创建多实例,如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。
由于SpecifiedAbility的启动模式配置为了指定实例启动模式,在SpecifiedAbility启动之前,会先进入其对应的AbilityStage的
[
onAcceptWant()
](
../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonacceptwant
)
生命周期回调中,解析传入的want参数,获取
`instanceKey`
自定义参数。根据业务需要通过AbilityStage的
[
onAcceptWant()
](
../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonacceptwant
)
生命周期回调返回一个字符串Key标识。
[
如果返回的Key对应一个已启动的UIAbility
](
mission-management-launch-type.md#fig14520125175314
)
,则会将之前的UIAbility拉回前台并获焦,而不创建新的实例,否则创建新的实例并启动。
3.
由于SpecifiedAbility的启动模式被配置为指定实例启动模式,因此在SpecifiedAbility启动之前,会先进入对应的AbilityStage的
[
onAcceptWant()
](
../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonacceptwant
)
生命周期回调中,以获取该UIAbility实例的Key值。然后系统会自动匹配,如果存在与该UIAbility实例匹配的Key,则会启动与之绑定的UIAbility实例,并进入该UIAbility实例的
[
onNewWant()
](
../reference/apis/js-apis-app-ability-uiAbility.md#abilityonnewwant
)
回调函数;否则会创建一个新的UIAbility实例,并进入该UIAbility实例的
[
onCreate()
](
../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate
)
回调函数和
[
onWindowStageCreate()
](
../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate
)
回调函数。
示例代码中,通过实现
[
onAcceptWant()
](
../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonacceptwant
)
生命周期回调函数,解析传入的
`want`
参数,获取自定义参数
`instanceKey`
。业务逻辑会根据这个参数返回一个字符串Key,用于标识当前UIAbility实例。如果返回的Key已经对应一个已启动的UIAbility实例,系统会将该UIAbility实例拉回前台并获焦,而不会创建新的实例。如果返回的Key没有对应已启动的UIAbility实例,则系统会创建新的UIAbility实例并启动。
```
ts
import
AbilityStage
from
'
@ohos.app.ability.AbilityStage
'
;
...
...
@@ -139,19 +136,17 @@ specified启动模式为指定实例模式,针对一些特殊场景使用(
}
}
```
> **说明:**
>
> 1.
应用的UIAbility实例已创建,该UIAbility配置为指定实例模式,再次调用[startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability)方法启动该UIAbility实例,且[AbilityStage](../reference/apis/js-apis-app-ability-abilityStage.md)的[onAcceptWant()](../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonacceptwant)回调匹配到一个已创建的UIAbility实例。由于启动的还是原来的UIAbility实例,并未重新创建一个新的UIAbility实例,此时再次启动该UIAbility时,只会进入该UIAbility的[onNewWant()](../reference/apis/js-apis-app-ability-uiAbility.md#abilityonnewwant)回调,不会进入其
[onCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate)和[onWindowStageCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate)生命周期回调。
> 1.
当应用的UIAbility实例已经被创建,并且配置为指定实例模式时,如果再次调用[startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability)方法启动该UIAbility实例,且[AbilityStage](../reference/apis/js-apis-app-ability-abilityStage.md)的[onAcceptWant()](../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonacceptwant)回调匹配到一个已创建的UIAbility实例,则系统会启动原来的UIAbility实例,并且不会重新创建一个新的UIAbility实例。此时,该UIAbility实例的[onNewWant()](../reference/apis/js-apis-app-ability-uiAbility.md#abilityonnewwant)回调会被触发,而不会触发
[onCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate)和[onWindowStageCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityonwindowstagecreate)生命周期回调。
> 2. DevEco Studio默认工程中未自动生成AbilityStage,AbilityStage文件的创建请参见[AbilityStage组件容器](abilitystage.md)。
例如在文档应用中,可以对不同的文档实例内容绑定不同的Key值。当每次新建文档的时候,可以传入不同的新Key值(如可以将文件的路径作为一个Key标识),此时AbilityStage中启动UIAbility时都会创建一个新的UIAbility实例;当新建的文档保存之后,回到桌面,或者新打开一个已保存的文档,回到桌面,此时再次打开该已保存的文档,此时AbilityStage中再次启动该UIAbility时,打开的仍然是之前原来已保存的文档界面。
以如下步骤所示进行举例说明。
1.
打开文件A,对应启动一个新的UIAbility实例,例如启动“UIAbility实例1”。
2.
在最近任务列表中关闭文件A的进程,此时UIAbility实例1被销毁,回到桌面,再次打开文件A,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例2”。
3.
回到桌面,打开文件B,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例3”。
4.
回到桌面,再次打开文件A,此时对应启动的还是之前的“UIAbility实例2”。
例如在文档应用中,可以为不同的文档实例内容绑定不同的Key值。每次新建文档时,可以传入一个新的Key值(例如可以将文件的路径作为一个Key标识),此时AbilityStage中启动UIAbility时都会创建一个新的UIAbility实例;当新建的文档保存之后,回到桌面,或者新打开一个已保存的文档,回到桌面,此时再次打开该已保存的文档,此时AbilityStage中再次启动该UIAbility时,打开的仍然是之前原来已保存的文档界面。
以如下步骤所示进行举例说明。
1.
打开
`文件A`
,对应启动一个新的UIAbility实例,例如启动
`UIAbility实例1`
。
2.
在最近任务列表中关闭
`文件A`
的任务进程,此时
`UIAbility实例1`
被销毁,回到桌面,再次打开
`文件A`
,此时对应启动一个新的UIAbility实例,例如启动
`UIAbility实例2`
。
3.
回到桌面,打开
`文件B`
,此时对应启动一个新的UIAbility实例,例如启动
`UIAbility实例3`
。
4.
回到桌面,再次打开
`文件A`
,此时仍然启动之前的
`UIAbility实例2`
,因为系统会自动匹配UIAbility实例的Key值,如果存在与之匹配的Key,则会启动与之绑定的UIAbility实例。在此例中,之前启动的
`UIAbility实例2`
与
`文件A`
绑定的Key是相同的,因此系统会拉回
`UIAbility实例2`
并让其获焦,而不会创建新的实例。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录