HarmonyOS 应用开发之任务(Mission)管理场景介绍

news/2024/7/21 11:17:41 标签: harmonyos, 华为, 鸿蒙, 移动开发, 交互

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

  • AbilityRecord:系统服务侧管理一个UIAbility实例的最小单元,对应一个应用侧的UIAbility组件实例。系统服务侧管理UIAbility实例数量上限为512个。
  • MissionRecord:任务管理的最小单元。一个MissionRecord中仅有一个AbilityRecord,即一个UIAbility组件实例对应一个单独的任务。
  • MissionList:一个从桌面开始启动的任务列表,记录了任务之间的启动关系,下一个任务由上一个任务启动,最底部的任务由桌面启动,这里称之为任务链。
  • MissionListManager:系统任务管理模块,内部维护了当前所有的任务链,与最近任务列表保持一致。

图1 任务管理示意图

任务的管理由系统应用(如桌面应用)负责,三方应用无法管理任务。用户通过最近任务列表进行任务的相关交互。当创建任务后,用户可以对最近任务列表进行如下操作:

  • 删除一个指定的任务。

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

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

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

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

  1. 桌面应用调用 missionManager 的接口管理任务,需要申请ohos.permission.MANAGE_MISSIONS权限,配置方式请参见 申请应用权限 。

  2. 利用missionManager进行任务管理(监听任务变化、获取任务信息、获取任务快照、清理任务、任务加锁/解锁等)。

import missionManager from '@ohos.app.ability.missionManager';
import { BusinessError } from '@ohos.base';
import image from '@ohos.multimedia.image';
import promptAction from '@ohos.promptAction';
import Logger from '../utils/Logger';

const TAG: string = 'TaskManager';

private listenerId: number = 0;
private missionId: number = 0;
private listener: missionManager.MissionListener = {
  // 任务创建
  onMissionCreated: (mission: number) => {
    Logger.info(TAG, '--------onMissionCreated-------');
  },
  // 任务销毁
  onMissionDestroyed: (mission: number) => {
    Logger.info(TAG, '--------onMissionDestroyed-------');
  },
  // 任务快照变化
  onMissionSnapshotChanged: (mission: number) => {
    Logger.info(TAG, '--------onMissionSnapshotChanged-------');
  },
  // 任务被移动到前台
  onMissionMovedToFront: (mission: number) => {
    Logger.info(TAG, '--------onMissionMovedToFront-------');
  },
  // 任务图标变化
  onMissionIconUpdated: (mission: number, icon: image.PixelMap) => {
    Logger.info(TAG, '--------onMissionIconUpdated-------');
  },
  // 任务名称变化
  onMissionLabelUpdated: (mission: number) => {
    Logger.info(TAG, '--------onMissionLabelUpdated-------');
  },
  // 任务实例被关闭
  onMissionClosed: (mission: number) => {
    Logger.info(TAG, '--------onMissionClosed-------');
  }
};

// 1.注册任务变化通知
this.listenerId = missionManager.on('mission', this.listener);
promptAction.showToast({
  message: $r('app.string.register_success_toast')
});
Logger.info(TAG, `missionManager.on success, listenerId = ${this.listenerId}`);

// 2.获取系统最近20个任务
missionManager.getMissionInfos('', 20, (error: BusinessError, missions: Array<missionManager.MissionInfo>) => {
  Logger.info(TAG, 'getMissionInfos is called, error = ' + JSON.stringify(error));
  Logger.info(TAG, 'size = ' + missions.length);
  Logger.info(TAG, 'missions = ' + JSON.stringify(missions));
  
  // 判断系统最近任务中是否包含etsclock
  for (let i = 0;i < missions.length; i++) {
    if (missions[i].want.bundleName === 'ohos.samples.etsclock') {
      promptAction.showToast({
        message: $r('app.string.obtain_success_toast')
      });
      Logger.info(TAG, `getMissionInfos.find etsclock, missionId  = ${missions[i].missionId}`);
      this.missionId = missions[i].missionId;
      return;
    }
  }
  promptAction.showToast({
    message: $r('app.string.obtain_failed_toast')
  });
});

// 3.获取单个任务的详细信息()
missionManager.getMissionInfo('', this.missionId).then((data: missionManager.MissionInfo) => {
  promptAction.showToast({
    message: JSON.stringify(data.want.bundleName)
  });
  Logger.info(TAG, `getMissionInfo successfully. Data: ${JSON.stringify(data)}`);
}).catch((error: BusinessError) => {
  Logger.error(TAG, `getMissionInfo failed. Cause: ${error.message}`);
});

// 4.获取任务快照
missionManager.getMissionSnapShot('', this.missionId, (error: BusinessError, snapshot: missionManager.MissionSnapshot) => {
  if (error === null) {
    promptAction.showToast({
      message: $r('app.string.obtain_snapshot_success_toast')
    });
  }
  Logger.info(TAG, 'getMissionSnapShot is called, error = ' + JSON.stringify(error));
  Logger.info(TAG, 'bundleName = ' + snapshot.ability.bundleName);
})

// 5.获取低分辨任务快照
missionManager.getLowResolutionMissionSnapShot('', this.missionId, (error: BusinessError, snapshot: missionManager.MissionSnapshot) => {
  if (error === null) {
    promptAction.showToast({
      message: $r('app.string.obtain_low_snapshot_success_toast')
    });
  }
  Logger.info(TAG, 'getLowResolutionMissionSnapShot is called, error = ' + JSON.stringify(error));
  Logger.info(TAG, 'bundleName = ' + snapshot.ability.bundleName);
})

// 6-1 加锁任务
missionManager.lockMission(this.missionId).then(() => {
  promptAction.showToast({
    message: $r('app.string.lock_success_toast')
  });
  Logger.info(TAG, 'lockMission is called ');
});

// 6-2 解锁任务
missionManager.unlockMission(this.missionId).then(() => {
  promptAction.showToast({
    message: $r('app.string.unlock_success_toast')
  });
  Logger.info(TAG, 'unlockMission is called ');
});

// 7.把任务切到前台
missionManager.moveMissionToFront(this.missionId).then(() => {
  Logger.info(TAG, 'moveMissionToFront is called ');
});

// 8.删除单个任务
missionManager.clearMission(this.missionId).then(() => {
  promptAction.showToast({
    message: $r('app.string.delete_success_toast')
  });
  Logger.info(TAG, 'clearMission is called ');
});

// 9.删除全部任务
missionManager.clearAllMissions().catch((err: BusinessError) => {
  Logger.info(TAG, `${err.code}`);
});

// 10.解注册任务变化通知
missionManager.off('mission', this.listenerId, (error: BusinessError) => {
  if (error === null) {
    promptAction.showToast({
      message: $r('app.string.unregister_success_toast')
    });
  }
  Logger.info(TAG, 'unregisterMissionListener');
})

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.
鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.niftyadmin.cn/n/5457934.html

相关文章

Linux内核之最核心数据结构之一:struct file(三十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Web安全基础入门+信息收集篇

教程介绍 学习信息收集&#xff0c;针对域名信息,解析信息,网站信息,服务器信息等&#xff1b;学习端口扫描&#xff0c;针对端口进行服务探针,理解服务及端口对应关系&#xff1b;学习WEB扫描&#xff0c;主要针对敏感文件,安全漏洞,子域名信息等&#xff1b;学习信息收集方法…

Partisia Blockchain:如何做到兼顾隐私、高性能和可拓展?

目前&#xff0c;包括Secret Network、Oasis Protocol等在内的绝大多数以隐私为特性的可编程公链&#xff0c;在兼顾隐私的同时&#xff0c;在可拓展以及性能上或多或少的有所牺牲&#xff0c;即难以对诸多实际应用场景进行支撑。这归咎于链的设计以及共识机制的不合理&#xf…

详解顺序结构滑动窗口处理算法

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

基于kalman的单目标追踪,以及demo测试(Python and C++)

一.卡尔曼滤波简单介绍 我们可以在任何含有不确定信息的动态系统中的使用卡尔曼滤波&#xff0c;对系统的下一步动作做出有根据的猜测。猜测的依据是预测值和观测值&#xff0c;首先我们认为预测值和观测值都符合高斯分布且包含误差&#xff0c;然后我们预设预测值的误差Q和观测…

04-JavaScript函数

函数&#xff08;重点&#xff09; 1.为什么使用函数? 用函数来解决代码重用的问题。 2.函数的意义 函数其实就是封装&#xff0c;把可以重复使用的代码放到函数中&#xff0c;如果需要多次使用同一段代码&#xff0c;就可以把封装成一个函数。这样的话&#xff0c;在你需…

考研数学一——概率论真题——自我总结题型整理(总分393)

系列文章目录 终于考完研了&#xff0c;本人考的是南京航空航天大学的仪器科学与技术&#xff0c;英一数一电路&#xff0c;以下是成绩单&#xff1a; 平时习惯整理自己的学习体系&#xff0c;以下是一个记录。 其实&#xff0c;每个人都应该训练&#xff0c;看到某一类题目…

JAVA的NIO和BIO底层原理分析

文章目录 一、操作系统底层IO原理1. 简介2. 操作系统进行IO的流程 二、BIO底层原理1. 什么是Socket2. JDK原生编程的BIO 三、Java原生编程的NIO1. 简介2. NIO和BIO的主要区别3. Reactor模式4. NIO的三大核心组件5. NIO核心源码分析 一、操作系统底层IO原理 1. 简介 IO&#x…