文章目录
1、Stage模型介绍
- HarmonyOS 3.1(API 9)新增模型。
- 提供了Ability Stage和Window Stage类作为应用组件和window窗口的“舞台”
2、Stage模型的Ability生命周期
- Ability的生命周期包括 create,Foreground,Background,Destroy四个状态
- WindowStageCreate和WindowStage Destroy为窗口管理器(WindowStage)在Ability中管理UI界面功能的两个生命周期。
3、Stage模型Ability启动模式
3.1、singleton(单实例模型)
- singleton是默认情况下的启动模式
- 每次调用startAbility()方法时,如果应用进程中该类型的Ability实例已经存在,则复用系统的Ability实例,系统中只会存在唯一一个该Ability对象,即在最近任务列表中存在一个该类型的Ability实例。此时,应用的Ability实例已经创建,当再次调用start Ability()方法启动该Ability实例时,只会进入该Ability的onNextWant()回调,不会进入onCreate()和onWindowStageCreate()生命周期回调
- 进行配置,将model.json5配置文件的launchType字段进行配置
"module": {
...
"abilities": [
{
"launchType": "singleton",
}
]
}
3.2、standard(标准实例模型)
- 在standard启动模式下,每次调用start Ability()方法时,都会在应用进程中创建一个新的该类型的Ability实例,即在最近任务列表中可以看到多个该类型的Ability实例
3.3、specified(指定实例模型)
- 在specified启动模式下,在Ability实例创建之前,允许开发者为该实例创建一个唯一的字符串key,创建的Ability实例绑定key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个key对应的Ability实例来响应start Ability请求。运行时由Ability内部业务决定是否创建多个实例,如果匹配有该Ability实例的key,则直接拉起与之绑定的Ability实例,否则创建一个新的Ability实例。
- 例如,用户在应用中重复打开一个文档时,启动的均是最近任务列表中的同一个任务,以及在应用中重复新建文档时,启动的均是最近任务列表中的新任务。这种情况下,可以将Ability配置为specified。当再次调用startAbility()方法启动该Ability实例,且Ability Stage的onAcceptWant()回调匹配到一个已经创建的Ability实例时,再次启动该Ability,只会进入该Ability的onNewWant()回调,不会进入其onCreate() 和 onWindowStageCreate()生命周期回调
4、Ability内页面的跳转和数据传递
4.1、页面跳转
- 页面间的导航可以通过route模块来实现,页面路由模块根据页面URL找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的URL访问不同的页面,包括跳转到Ability内指定页面
4.1.1、route.pushUrl()
- 通过调用route.push()方法,跳转到Aility内的指定页面,每调用一次route.push()都会新建一个页面,默认情况下,页面栈数量会增加1,页面栈支持最大页面数量为32。
- 当页面站数量较大或者超过32时,可以通过route.clean()方法清除页面栈中的所有历史页面,仅保留当前页面作为栈顶页面
.onClick(() =>{
router.pushUrl({
url:'pages/SecondPage',
params:{
src:'第一个页面传递的值'
}
})
4.1.2、route.pushUrl()加mode参数
- route.pushUrl()方法新增mode参数,可以将mode参数设置为routerRouterMode.Single单实例模式和routerRouterMode.Standard标准模式。
- 在单实例模式下,如果目标页面在页面栈中已经存在同URL的页面,离栈顶最近的URL的页面会被移动到栈顶,移动后的页面为新建页面,原来的页面仍然保存在栈中。页面栈数量不变;如果目标页面在页面栈中不存在URL的页面,那么按照标准模式跳转,页面栈数量会加1。
.onClick(() =>{
router.pushUrl({
url:'pages/SecondPage',
params:{
src:'第一个页面传递的值'
}
},router.RouterMode.Single)
})
4.1.3、route.replaceUrl()
- 通过调用route.placeUrl()方法,跳转到Ability内的指定页面,将使用新的页面替换当前页面,并销毁被替换的当前页面,页面的数量不变
.onClick(() => {
router.replaceUrl({
url:'pages/SecondPage',
params:{
src:'第一个页面传递的值'
}
})
})
4.1.4、route.replaceUrl()加mode参数
- route.replaceUrl()方法新增mode参数,可以将mode参数设置为routerRouterMode.Single单实例模式和routerRouterMode.Standard标准模式。
- 在单实例模式下,如果目标页面在页面栈中已经存在同URL的页面,离栈顶最近的URL的页面会被移动到栈顶,替换当前的页面。并销毁被替换的页面,移动后的页面为新建页面,页面栈数量会减1;如果目标页面在页面栈中不存在URL的页面,那么按照标准模式跳转,页面栈数量会保持不变。
.onClick(() => {
router.replaceUrl({
url:'pages/SecondPage',
params:{
src:'第一个页面传递的值'
}
},router.RouterMode.Standard)
})
4.2、接收参数
通过router.getParams()方法接收传递的值
@State message: string = router.getParams()?.['src'];