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

2024-02-25 02:36

本文主要是介绍【鸿蒙开发】第十四章 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}`);
});

在这里插入图片描述

这篇关于【鸿蒙开发】第十四章 Stage模型应用组件-任务Mission的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744162

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10