【鸿蒙开发】第十四章 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; // UIAbilityContext

context.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://www.mfbz.cn/a/407027.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python实战: 获取 后缀名(扩展名) 或 文件名

Python实战: 获取 后缀名(扩展名) 或 文件名 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订阅和支持~ &…

【大厂AI课学习笔记NO.52】2.3深度学习开发任务实例(5)需求采集考虑维度

今天来学习,怎么做需求分析,如何明确数据采集需求。 我把自己考试通过的学习笔记,都分享到这里了,另外还有一个比较全的思维脑图,我导出为JPG文件了。下载地址在这里:https://download.csdn.net/download/g…

《Linux C编程实战》笔记:信号量

信号量在操作系统的书里一般都有介绍,这里就只写书上说的了。 信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。临界资源可以简单地理解为在某一时刻只能由一个进程或线程进行操作的资源,这里的…

FairyGUI × Cocos Creator 3.x 使用方式

前言 上一篇文章 FariyGUI Cocos Creator 入门 简单介绍了FairyGUI,并且按照官方demo成功在Cocos Creator2.4.0上运行起来了。 当我今天使用Creator 3.x 再引入2.x的Lib时,发现出现了报错。 这篇文章将介绍如何在Creator 3.x上使用fgui。 引入 首先&…

EarMaster Pro 7 简体中文破解版下载 v7.2.0.42 电脑版

软件介绍 EarMaster Pro 简体中文破解版是一款由丹麦皇家音乐学院官方制作的多功能音乐品鉴教育软件,软件具有丰富的功能,它可以自定义培训课程,针对性地训练音准、节奏、和声等音乐要素,用户可以根据自身需求和水平选择不同难度…

Minimize Inversions

先来看看官方题解的做法,他一反常态的没有在逆序对题目里面考虑每个位置的贡献,而是直接回到定义考虑每对数是否是逆序对 我们考虑原数列中任意的一组数\((a_i,a_j)\)和\((b_i,b_j)\)。如果最开始两个都不是逆序对,那么交换之后两个都是逆序对…

RabbitMQ的死信队列和延迟队列

文章目录 死信队列如何配置死信队列死信队列的应用场景Spring Boot实现RabbitMQ的死信队列 延迟队列方案优劣:延迟队列的实现有两种方式: 死信队列 1)“死信”是RabbitMQ中的一种消息机制。 2)消息变成死信,可能是由于…

VBA语言専攻资料周末新增

各位T3学员∶本周VBA技术资料增加5讲到385讲,看到通知后联络我免费领取资料。成果来之不易,您更新后请说声谢谢,感恩我的成果。MF381:使工作表使用区域适合窗口MF382:引用复制后的工作表MF383:处理Excel中存…

外星文明会是朋友还是敌人?科学家用AI模拟揭示惊人答案!

引言:人类与外星文明的潜在互动 自古以来,人类就对外太空充满了好奇与向往,无数科幻作品中都描绘了人类与外星文明的潜在互动。然而,这些互动并非总是和平友好的,正如物理学家Stephen Hawking所警告的,盲目…

Linux安装jdktomcatMySQl一战完成

一、jdk安装具体步骤 1、查询是否有jdk java -version 2、进入opt目录 cd /opt/ 连接服务器工具 进入opt目录,把压缩文件上传 查询是否查询成功 进入解压到的目录 cd /usr/local/创建新文件夹 mkdir java 再回到opt目录进行解压 cd /opt 解压到刚刚创建的文…

如何使用 NFTScan NFT API 在 Mantle 网络上开发 Web3 应用

Mantle Network 是建立在以太坊区块链之上的第 2 层扩展解决方案,采用了 Optimistic Rollups 技术,由 BitDAO 孵化,以提供比以太坊更快速和更经济的交易体验。由于 Mantle 基础链构建在 OP Stack 之上并与 EVM 兼容,因此以太坊网络…

LeetCode 102. 二叉树的层序遍历

题目链接https://leetcode.cn/problems/binary-tree-level-order-traversal/description/ 通过队列实现层序遍历 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res new ArrayList<>();Queue<…

读书笔记之《巨富》:如何成为全球顶级富豪?

《巨富—全球超级新贵的崛起和其他人的没落》的作者是[美]克里斯蒂娅•弗里兰&#xff0c; 原作名: Plutocrats: The Rise of the New Global Super-Rich and the Fall of Everyone Else &#xff0c;2013年出版。 克里斯蒂娅•弗里兰&#xff08;Chrystia Freeland&#xff…

Linux使用C语言获取进程信息

Linux使用C语言获取进程信息 Author: OnceDay Date: 2024年2月22日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档: Linux proc目录详解_/proc/mounts-CSDN博客Linux下/proc目录介绍 - 知乎 (zhihu.com)Linux内…

Android 如何添加自定义字体

Android 如何添加自定义字体 比如我要添加 jetbrains 相关字体 在 res 文件夹中添加 font 文件夹。里面放入你的字体文件 .ttf .otf&#xff0c;字体文件名需要是小写&#xff0c;只能是字母和下划线。 在 xml 布局文件中直接通过 android:fontFamily"font/jetbrainsmo…

Python实战:xlsx文件的读写

Python实战&#xff1a;xlsx文件的读写 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持~ &#…

基于java Springboot实现教务管理系统

基于java Springboot实现教务管理系统《视频版-建议收藏》 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

Springboot集成prometheus快速入门demo

一、介绍 prometheus Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包&#xff0c;自此以后&#xff0c;许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃&#xff0…

【深度学习笔记】3_5 图像分类数据集fashion-mnist

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.5 图像分类数据集&#xff08;Fashion-MNIST&#xff09; 在介绍softmax回归的实现前我们先引入一个多类图像分类数据集。它将在后面的章节中被多次使用&#xff0c…

抖音视频评论数据提取软件|抖音数据抓取工具

一、开发背景&#xff1a; 在业务需求中&#xff0c;我们经常需要下载抖音视频。然而&#xff0c;在网上找到的视频通常只能通过逐个复制链接的方式进行抓取和下载&#xff0c;这种操作非常耗时。我们希望能够通过关键词自动批量抓取并选择性地下载抖音视频。因此&#xff0c;为…
最新文章