【鸿蒙开发】第十四章 Stage模型应用组件-任务Mission

1 任务(Mission)管理场景

任务(Mission)管理相关的基本概念如下:

  • AbilityRecord:系统服务侧管理一个UIAbility实例的最小单元,对应一个应用侧的UIAbility组件实例。系统服务侧管理UIAbility实例数量上限为512个。

  • MissionRecord:任务管理的最小单元。一个MissionRecord中仅有一个AbilityRecord,即一个UIAbility组件实例对应一个单独的任务。

  • MissionList:一个从桌面开始启动的任务列表,记录了任务之间的启动关系,下一个任务由上一个任务启动,最底部的任务由桌面启动,这里称之为任务链。

  • MissionListManager:系统任务管理模块,内部维护了当前所有的任务链,与最近任务列表保持一致。
    在这里插入图片描述
    任务的管理由系统应用(如桌面应用)负责,三方应用无法管理任务。用户通过最近任务列表进行任务的相关交互。当创建任务后,用户可以对最近任务列表进行如下操作:

  • 删除一个指定的任务。

  • 加锁或解锁一个指定的任务(加锁后的任务在清理所有任务时不会被清理)。

  • 清理最近任务列表中的所有任务。

  • 将一个指定的任务切换到前台。

一个UIAbility实例对应一个单独的任务,因此应用调用startAbility()方法启动一个UIAbility时,就是创建了一个任务。

  1. 桌面应用调用missionManager的接口管理任务,需要申请ohos.permission.MANAGE_MISSIONS权限,配置方式请参见配置文件权限声明。
  2. 利用missionManager进行任务管理(监听任务变化、获取任务信息、获取任务快照、清理任务、任务加锁/解锁等)。
import missionManager from '@ohos.app.ability.missionManager'
import { BusinessError } from '@ohos.base';let listener: missionManager.MissionListener = {// 任务创建onMissionCreated: (mission) => {console.info("--------onMissionCreated-------")},// 任务销毁onMissionDestroyed: (mission) => {console.info("--------onMissionDestroyed-------")},// 任务快照变化onMissionSnapshotChanged: (mission) => {console.info("--------onMissionSnapshotChanged-------")},// 任务被移动到前台onMissionMovedToFront: (mission) => {console.info("--------onMissionMovedToFront-------")},// 任务图标变化onMissionIconUpdated: (mission, icon) => {console.info("--------onMissionIconUpdated-------")},// 任务名称变化onMissionLabelUpdated: (mission) => {console.info("--------onMissionLabelUpdated-------")},// 任务实例被关闭onMissionClosed: (mission) => {console.info("--------onMissionClosed-------")}
};// 1.注册任务变化通知
let listenerId = missionManager.on('mission', listener);// 2.获取系统最近20个任务
missionManager.getMissionInfos("", 20, (error, missions) => {console.info("getMissionInfos is called, error.code = " + error.code);console.info("size = " + missions.length);console.info("missions = " + JSON.stringify(missions));
});// 3.获取单个任务的详细信息()
let missionId = 11; // 11只是示例,实际是从系统中获取的任务id,下面类似
let mission = missionManager.getMissionInfo("", missionId).catch((err: BusinessError) => {console.info('${err.code}');
});// 4.获取任务快照
missionManager.getMissionSnapShot("", missionId, (error, snapshot) => {console.info("getMissionSnapShot is called, error.code = " + error.code);console.info("bundleName = " + snapshot.ability.bundleName);
})// 5.获取低分辨任务快照
missionManager.getLowResolutionMissionSnapShot("", missionId, (error, snapshot) => {console.info("getLowResolutionMissionSnapShot is called, error.code = " + error.code);console.info("bundleName = " + snapshot.ability.bundleName);
})// 6.加锁/解锁任务
missionManager.lockMission(missionId).then(() => {console.info("lockMission is called ");
});missionManager.unlockMission(missionId).then(() => {console.info("unlockMission is called ");
});// 7.把任务切到前台
missionManager.moveMissionToFront(missionId).then(() => {console.info("moveMissionToFront is called ");
});// 8.删除单个任务
missionManager.clearMission(missionId).then(() => {console.info("clearMission is called ");
});// 9.删除全部任务
missionManager.clearAllMissions().catch((err: BusinessError) => {console.info('${err.code}');
});// 10.解注册任务变化通知
missionManager.off('mission', listenerId, (error) => {console.info("unregisterMissionListener");
})

2 任务(Mission)与启动模式

如前文所述,一个UIAbility实例对应一个任务。UIAbility实例个数与UIAbility配置的启动模式有关。在FA模型下,通过config.json配置文件中的“launchType”属性配置;在Stage模型下,通过module.json5配置文件中的“launchType”属性配置。

下面介绍了任务管理如何实现以下三种启动模式UIAbility组件的管理:

2.1 singleton单实例模式

应用在运行时只存在一个该UIAbility实例。
在这里插入图片描述

2.2 multiton多实例模式

每次调用startAbility()方法,都会在应用进程中创建一个该UIAbility实例。
在这里插入图片描述

2.3 specified指定实例模式

AbilityStage的(onAcceptWant())决定是否创建新的UIAbility实例。
在这里插入图片描述
每个UIAbility实例都对应了一个最近任务列表中看到的Mission(任务)。
每个UIAbility实例对应的Mission都保留有该UIAbility实例的快照(Snapshot)UIAbility实例销毁后,Mission信息(包括UIAbility信息和任务快照)依然会保留,直到用户删除该任务。

3 页面栈及任务链

3.1 页面栈

单个UIAbility组件可以实现多个页面,并在多个页面之间跳转,这种UIAbility组件内部的页面跳转关系称为“页面栈”,由ArkUI框架统一管理,如下图中:
UIAbility1Page1->Page2->Page3
UIAbility2PageA->PageB->PageC

在这里插入图片描述

  • 页面栈的形成(下面2/3/5/6步骤为页面跳转,由ArkUI管理)
  1. 点击桌面图标(startAbility)启动UIAbility1UIAbility1的初始页面为Page1
  2. 点击Page1页面按钮(Navigator)跳转到Page2页面。
  3. 点击Page2页面按钮(Navigator)跳转到Page3页面。
  4. 点击Page3页面按钮(startAbility)跳转到UIAbility2UIAbility2的初始页面为PageA
  5. 点击PageA页面按钮(Navigator)跳转到PageB页面。
  6. 点击PageB页面按钮(Navigator)跳转到PageC页面。
  • 页面栈的返回(下面1/2/4/5步骤为页面跳转,由ArkUI管理)
  1. UIAbility2PageC页面点击返回键回到UIAbility2PageB页面。
  2. UIAbility2PageB页面点击返回键回到UIAbility2PageA页面。
  3. UIAbility2PageA页面点击返回键跳转到UIAbility1Page3页面。
  4. UIAbility1Page3页面点击返回键回到UIAbility1Page2页面。
  5. UIAbility1Page2页面点击返回键回到UIAbility1Page1页面。
  6. UIAbility1Page1页面点击返回键回到桌面

3.2 任务链

上文介绍了页面栈的返回,如果Ability2页面栈一层层通过返回键返回到最底层,再次点击返回键时,会返回到Ability1。因为在MissionList中记录了任务(Mission)之间的启动关系,即如果Ability1通过startAbility启动Ability2,则会形成一个MissionList任务链Ability1->Ability2,当Ability2页面栈返回到首页时,再次点击返回键,会返回到Ability1的页面。

MissionList任务链记录了任务之间的拉起关系,但是这个任务链可能会断开,有以下几种情况会导致任务链的断开:

  1. 进入任务列表,把任务链中间某个任务移动到前台。
    在这里插入图片描述
  2. 进入任务列表,把任务链中间某个任务清理掉。
    在这里插入图片描述
  3. 单实例UIAbility的任务,被不同的任务(包括Ability或桌面)反复拉起(AbilityB为单例)。
    在这里插入图片描述

4 设置任务快照的图标和名称

设置任务快照的图标和名称是为了提高用户界面的可视化性和用户体验,以便更好地管理和跟踪应用程序中的任务和功能。通过为每个任务快照设置不同的图标名称,可以更轻松地区分和识别每个任务的功能。

默认情况下任务快照的图标和名称采用的是module.json5配置文件的abilities标签中的iconlabel字段,如下图所示。
在这里插入图片描述

也可以使用UIAbilityContext.setMissionIcon()UIAbilityContext.setMissionLabel()方法,根据需要自定义任务快照的图标和名称。例如,对于UIAbility的多实例启动模式,可以根据不同的功能配置相应的任务快照的图标名称

4.1 设置任务快照的图标(仅对系统应用开放)

通过调用UIAbilityContext.setMissionIcon()方法修改任务快照的图标。

import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';let context: common.UIAbilityContext = ...; // UIAbilityContext
let pixelMap: PixelMap = ...; // 图片的PixelMap信息context.setMissionIcon(pixelMap, (err: BusinessError) => {if (err.code) {console.error(`Failed to set mission icon. Code is ${err.code}, message is ${err.message}`);}
})

在这里插入图片描述

4.2 设置任务快照的名称

通过调用UIAbilityContext.setMissionLabel()方法修改任务快照的名称。

import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';let context: common.UIAbilityContext = this.context; // UIAbilityContextcontext.setMissionLabel('test').then(() => {console.info('Succeeded in seting mission label.');
}).catch((err: BusinessError) => {console.error(`Failed to set mission label. Code is ${err.code}, message is ${err.message}`);
});

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2807550.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

#FPGA(IRDA)

1.IDE:Quartus II 2.设备:Cyclone II EP2C8Q208C8N 3.实验:IRDA(仿真接收一个来自0x57地址的数据0x22 (十进制34)) 4.时序图: 5.步骤 6.代码: irda_receive.v module irda_receive ( input wire…

Llama2模型的优化版本:Llama-2-Onnx

Llama2模型的优化版本:Llama-2-Onnx。 Llama-2-Onnx是Llama2模型的优化版本。Llama2模型由一堆解码器层组成。每个解码器层(或变换器块)由一个自注意层和一个前馈多层感知器构成。与经典的变换器相比,Llama模型在前馈层中使用了不…

MySQL sql注意点

本文列取了常用但是容易遗漏的一些知识点。另外关键词一般大写,为了便于阅读所以很多小写。也为了给自己查缺补漏。 distinct(去重) 也许你经常对单个字段去重,并且知道不建议用distinct,而是group by,因为…

FL Studio21中文版功能、特点、使用场景及适用人群详解

一、功能介绍 FL Studio21中文版作为一款功能全面的数字音频工作站(DAW),提供了从音乐创作到后期混音所需的完整工具集。以下是其主要功能: FL Studio 21.2.3 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 …

Vue3_基础使用_3_Hooks模块化

今天主要学习的是hooks, vue3的使用比vue2方便很多了,但是呢各个功能块的逻辑有时候还是会缠绕在一起,这个时候使用hooks进行模块化管理开发,说白了就是将每个单独的业务放到自己的.ts中去写,以后修改就找到这个ts 不用到处去翻…

VsCode的leetcode插件无法登录

前提 想使用VsCode的leetcode插件进行刷题,然后按照网上的教程进行安装下载,但是到了登录这一步,死活也登录不了,然后查看log一直报的错误是invalid password。 解决方法 首先确定在插件中设置的站点是Leetcode中国&#xff0c…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Tile/Blur)

上篇文章介绍了y语义分割Seg,这篇文章介绍下Tile/Blur(增加/减少细节) Tile用于增加图片细节,一般用于高清修复,Blur用于减少图片细节(图片模糊),如下图,用Tile做修复&a…

apidoc接口文档的自动更新与发布

文章目录 一、概述二、环境准备三、接口文档生成1. 下载源码2. 初始化3.执行 四、文档发布五,配置定时运行六,docker运行 一、概述 最近忙于某开源项目的接口文档整理,采用了apidoc来整理生成接口文档。 apidoc是一个可以将源代码中的注释直…

说说设备像素、css像素、设备独立像素、dpr、ppi 之间的区别

文章目录 一、背景二、介绍CSS像素设备像素设备独立像素dprppi 三、总结参考文献 一、背景 在css中我们通常使用px作为单位,在PC浏览器中css的1个像素都是对应着电脑屏幕的1个物理像素 这会造成一种错觉,我们会认为css中的像素就是设备的物理像素 但实…

谷歌连发 Gemini1.5、Gemma两种大模型,Groq让模型输出速度快18倍

本周,我们观察到以下AI领域的新动向和新趋势: 1.谷歌连发Gemini1.5和Gemma两种大模型, 其中Gemini1.5采用MoE架构,并拥有100万token上下文长度,相比Gemini 1.0性能大幅提升。Gemma是谷歌新推出的开源模型,…

精品基于SpringBoot+Vue的常规应急物资管理系统

《[含文档PPT源码等]精品基于SpringBootVue的常规应急物资管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: Java——涉及技术: 前端使用技术&#xff…

手写redux和applyMiddleware中间件react示例

目录 一 核心代码 1.reducer 2.store.js 二 关于context API的使用 1. MyContext 2. createContext 3. ContextProvider 4. connect 三 组件验证效果 1. Todo 2. TodoList 3.TodoItem 4.TodoInput 5. App组件引入Todo组件 一 核心代码 1.reducer // 新增列表数…

企业如何定制化“可靠的”系统,实现数字化转型?

二十大提出高质量发展是首要任务,为顺应数字经济时代的发展,数字化转型正不断赋能各行各业。越来越多的企业管理者也意识到数字化转型是帮助企业提升内部运营效率,提升业务开展效率,减低企业成本的有效手段。 那么如何推动企业数字…

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具 基于java fx写的一款支持加载自定义poc文件的、可扩展的的图形化渗透测试框架。支持批量漏洞扫描、漏洞利用、结果导出等功能。 使用 经过测试,项目可在jdk8环境下正常使用。jdk11因为缺少一些必要的组件,所以jdk11版本工…

《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义:分布式环境下的事务处理机制 CAP定理:在一个分布式系统中,涉及共享数据问题时,以下三个特性最多只能同时满足两个 一致性:代表数据在任何时刻、任何分布式节点中看到的都是符合预期的&#xff0…

嵌入式按键处理驱动(easy_button)

简介 在嵌入式裸机开发中,经常有按键的管理需求,GitHub上已经有蛮多成熟的按键驱动了,但是由于这样那样的问题,最终还是自己实现了一套。本项目地址:bobwenstudy/easy_button (github.com)。 项目开发过程中参考了如…

基于Java SSM框架实现问卷调查系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现问卷调查系统演示 B/S结构 BROWSER/SERVER程序架构方式是使用电脑中安装的各种浏览器来进行访问和使用的,相比C/S的程序结构不需要进行程序的安装就可以直接使用。BROWSER/SERVER架构的运行方式是在远程的服务器上进行安装一个,然…

《隐私计算简易速速上手小册》第7章:隐私计算与云计算/边缘计算(2024 最新版)

文章目录 7.1 云计算中的隐私保护7.1.1 基础知识7.1.2 主要案例:使用 Python 实现云数据的安全上传和访问7.1.3 拓展案例 1:实现基于角色的访问控制7.1.4 拓展案例 2:使用 Python 保护 API 安全7.2 边缘计算的隐私问题7.2.1 基础知识7.2.2 主要案例:使用 Python 实现边缘设…

Mycat核心教程--mycat实战应用【一】

Mycat核心教程--mycat实战应用 一、MyCat概述1.1.Mycat 是数据库中间件1.2.为什么要用Mycat1.3.数据库中间件对比1.4.Mycat的官网1.4.1.Mycat的官网:[http://www.mycat.org.cn/](http://www.mycat.org.cn/)1.4.2.右上角下载里面有个文件下载服务,点进去发现无法访问…

Golang Redis:构建高效和可扩展的应用程序

利用Redis的闪电般的数据存储和Golang的无缝集成解锁协同效应 在当前的应用程序开发中,高效的数据存储和检索的必要性已经变得至关重要。Redis,作为一个闪电般快速的开源内存数据结构存储方案,为各种应用场景提供了可靠的解决方案。在这份完…