ArtTS系统能力-窗口管理的学习(3.2)
上篇回顾: ArtTS系统能力-通知的学习(3.1)
本篇内容: ArtTS系统能力-窗口管理的学习(3.2)
一、 知识储备
1. 基本概念
- 窗口渲染式能力:指对状态栏、导航栏等系统窗口进行控制,减少状态栏、导航栏等系统界面的突兀感,从而使用户获得更好的体验。
渲染式能力只在应用主窗口作为全屏窗口时生效,通常情况下,应用子窗口(弹窗、悬浮窗口等辅助窗口)无法使用沉浸式能力 - 悬浮窗:全局悬浮窗口是一种特殊的应用窗口,具备在应用主窗口和对应Ability退到后台后,仍然可以在前台显示的能力。
悬浮窗口可以用于应用退到后台后,使用小窗继续播放视频、或者为特定的应用创建悬浮球等快速入口。应用在创建悬浮窗口前,需要申请对应的权限(ohos.permission.SYSTEM_FLOAT_WINDOW)。
2.使用场景
- 设置应用主窗口属性及目标页面
在Stage模型下,应用主窗口由UIAbility创建并维护其生命周期。在UIAbility的onWindowStageCreate回调中,获取WindowStage,即可对其进行属性设置,也可以在应用配置文件中设置应用主窗口的属性。
createMainWindow(windowStage: window.WindowStage) {//第一步:获取应用主窗口let windowClazz = null;windowStage.getMainWindow((err, data) => {if (err) {console.error('该设备不支持')return;}windowClazz = data;//第二步:设置主窗口属性let isTouchable = true;windowClazz.setWindowTouchable(isTouchable, (err) => {if (err) {console.error('不支持触摸')return;}})//第三步:为主窗口加载对应的目标页面windowStage.loadContent("pages/StudyWidget", err => {if (err.code) {console.error('响应失败')return;}})})}
- 设置应用子窗口属性及目标页面
createSubWindow(windowStage: window.WindowStage) {windowStage.createSubWindow('mySubWindow', (err, data) => { //1. 获取创建子窗口if (err) {console.error('不支持子窗口')return;}windowClazz = data;})windowClazz.moveWindowTo(300, 300, err => { //2. 设置子窗口属性if (err) {console.error('不支持子窗口移动')return;}})windowClazz.resize(500, 500, err => { //3. 修改子窗口属性if (err.code) {console.error('不支持子窗口改变尺寸')}})windowClazz.setUIContent('pages/StudyLayout', err => { //4. 加载对应的目标页面if (err.code) {console.error('子窗口加载页面失败')return;}windowClazz.showWindow(err => {if (err.code) {console.error('子窗口页面显示失败')return;}})})}destroySubWindow() {windowClazz.destroyWindow(err => {if (err.code) {console.error('子窗口销毁失败')return;}})}
- 体验窗口沉浸式能力
setupWindow(windowStage: window.WindowStage) {let windowClazz = null;windowStage.getMainWindow((err, data) => {if (err.code) {console.error(`${JSON.stringify(err)}`)return;}windowClazz = data;let names = [];windowClazz.setWindowSystemBarEnable(names, err => {if (err.code) {console.error(`${JSON.stringify(err)}`)return;}})})windowStage.loadContent('pages/StudyWidget', err => {if (err.code) {console.error(`${JSON.stringify(err)}`)return;}})}
- 设置悬浮窗口
addFloatWindow(windowStage: window.WindowStage) {let windowClazz = null;let config = {name: 'floatWindow', windowType: window.WindowType.TYPE_FLOAT, ctx: this.context};window.createWindow(config, (err, data) => {if (err.code) {console.error(`不支持:${JSON.stringify(err)}`)return;}windowClazz = data;windowClazz.moveWindowTo(300,300,err=>{if (err.code) {console.error(JSON.stringify(err))return;}})windowClazz.resize(500,500,err =>{if (err.code) {console.error(JSON.stringify(err))return;}})windowClazz.setUIContent("pages/StudyWidget",err=>{if (err.code) {console.error(JSON.stringify(err))return;}windowClazz.showWindow(err=>{if (err.code) {console.error(JSON.stringify(err));return;}})})})}
二、 效果一览
三、源码剖析
import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';
import thermal from '@ohos.thermal';let windowClazz = null;export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, 'testTag', '%{public}s', '我被创建了');globalThis.initTitle = '我是测试标题'}onDestroy() {hilog.info(0x0000, 'testTag', '%{public}s', '我被销毁了');}/*****************在这里定义LocalStorage*****************/args: Record<string, Object> = {'height': 111, 'age': 10, 'name': '小明', sex: '未知'};storage: LocalStorage = new LocalStorage(this.args)onWindowStageCreate(windowStage: window.WindowStage) {hilog.info(0x0000, 'testTag', '%{public}s', '系统接管创建');// windowStage.loadContent('pages/event/EventStudy', this.storage) //把localStorage实例传递过去windowStage.loadContent('pages/manager/NotificationIndex', this.storage) //把localStorage实例传递过去// this.createMainWindow(windowStage)// this.createSubWindow(windowStage)// this.setupWindow(windowStage)this.addFloatWindow(windowStage)}/*****************在这里定义LocalStorage*****************/onWindowStageDestroy() {// Main window is destroyed, release UI related resourceshilog.info(0x0000, 'testTag', '%{public}s', '系统接管销毁');this.destroySubWindow();}onForeground() {// Ability has brought to foregroundhilog.info(0x0000, 'testTag', '%{public}s', '我要可见了');}onBackground() {// Ability has back to backgroundhilog.info(0x0000, 'testTag', '%{public}s', '我不可见了');}createSubWindow(windowStage: window.WindowStage) {windowStage.createSubWindow('mySubWindow', (err, data) => { //1. 获取创建子窗口if (err) {console.error('不支持子窗口')return;}windowClazz = data;})windowClazz.moveWindowTo(300, 300, err => { //2. 设置子窗口属性if (err) {console.error('不支持子窗口移动')return;}})windowClazz.resize(500, 500, err => { //3. 修改子窗口属性if (err.code) {console.error('不支持子窗口改变尺寸')}})windowClazz.setUIContent('pages/StudyLayout', err => { //4. 加载对应的目标页面if (err.code) {console.error('子窗口加载页面失败')return;}windowClazz.showWindow(err => {if (err.code) {console.error('子窗口页面显示失败')return;}})})}destroySubWindow() {windowClazz.destroyWindow(err => {if (err.code) {console.error('子窗口销毁失败')return;}})}addFloatWindow(windowStage: window.WindowStage) {let windowClazz = null;let config = {name: 'floatWindow', windowType: window.WindowType.TYPE_FLOAT, ctx: this.context};window.createWindow(config, (err, data) => {if (err.code) {console.error(`不支持:${JSON.stringify(err)}`)return;}windowClazz = data;windowClazz.moveWindowTo(300,300,err=>{if (err.code) {console.error(JSON.stringify(err))return;}})windowClazz.resize(500,500,err =>{if (err.code) {console.error(JSON.stringify(err))return;}})windowClazz.setUIContent("pages/StudyWidget",err=>{if (err.code) {console.error(JSON.stringify(err))return;}windowClazz.showWindow(err=>{if (err.code) {console.error(JSON.stringify(err));return;}})})})}setupWindow(windowStage: window.WindowStage) {let windowClazz = null;windowStage.getMainWindow((err, data) => {if (err.code) {console.error(`${JSON.stringify(err)}`)return;}windowClazz = data;let names = [];windowClazz.setWindowSystemBarEnable(names, err => {if (err.code) {console.error(`${JSON.stringify(err)}`)return;}})})windowStage.loadContent('pages/StudyWidget', err => {if (err.code) {console.error(`${JSON.stringify(err)}`)return;}})}createMainWindow(windowStage: window.WindowStage) {//第一步:获取应用主窗口let windowClazz = null;windowStage.getMainWindow((err, data) => {if (err) {console.error('该设备不支持')return;}windowClazz = data;//第二步:设置主窗口属性let isTouchable = true;windowClazz.setWindowTouchable(isTouchable, (err) => {if (err) {console.error('不支持触摸')return;}})//第三步:为主窗口加载对应的目标页面windowStage.loadContent("pages/StudyWidget", err => {if (err.code) {console.error('响应失败')return;}})})}
}
相关文章:
ArtTS系统能力-窗口管理的学习(3.2)
上篇回顾: ArtTS系统能力-通知的学习(3.1) 本篇内容: ArtTS系统能力-窗口管理的学习(3.2) 一、 知识储备 1. 基本概念 窗口渲染式能力:指对状态栏、导航栏等系统窗口进行控制,减…...
C++ 运算符的优先级和关联性表
C 运算符的优先级和关联性表 1. Precedence and associativity (优先级和结合性)2. Alternative spellings (替代拼写)3. C operator precedence and associativity table (C 运算符的优先级和关联性表)References C documentation (C 文档) https://learn.microsoft.com/en-us…...
正则表达式替换字符串的方法
正则表达式替换字符串的方法 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一个非常实用的编程技术:使用正则表达式替换字符串。正则…...
开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(五)
一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…...
2024/7/4总结
http协议 http协议,是一个客户端请求和响应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可以从服务器上取得所需要的网页信息。 通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给…...
【Android面试八股文】Looper如何在子线程中创建?
文章目录 一、Looper的几个重要方法二、子线程中使用Looper的方式1三、子线程中使用Looper的方式23.1 使用HandlerThread实现3.2 HandlerThread源码解析创建子线程的 Looper必须要通过 Looper.prepare()初始化looper,然后再通过 Looper.loop()方法让 Loop运行起来。 那么具…...
IT项目管理文档体系
IT项目管理文档体系是确保项目顺利进行、有效沟通和合规性的关键组成部分。一个完善的文档体系能够帮助项目团队记录决策过程、明确职责、跟踪进度、管理变更并提供审计痕迹。 项目启动文档: 项目章程:正式授权项目启动,定义项目目标、范围、…...
ELK企业内部日志分析系统(1)
ELKKafkaFilebeat企业内部日志分析系统(1) Elasticsearch集群部署 1.部署环境 IP地址主机名配置系统版本192.168.222.129es12核4GRockyLinux192.168.222.130es22核3GRockyLinux192.168.222.131es32核3GRockyLinux 2.配置主机名解析和主机名 #关闭防火墙与selinux #更改主机…...
反序列化POP链技术详解
POP( Procedure Oriented Programming )链是反序列化安全问题中相对比较重要的技术点,相比于其他的反序列化问题,这种漏洞的产生更加难以发现,以及在利用上也比较复杂。 要掌握这个东西首先要先了解面向对象中的几个特…...
process.env.VUE_APP_BASE_API
前端:process.env.VUE_APP_BASE_API 在Vue.js项目中,特别是使用Vue CLI进行配置的项目,process.env.VUE_APP_BASE_API 是一个环境变量的引用。Vue CLI允许开发者在不同环境下配置不同的环境变量,这对于管理API基础路径、切换开发…...
面试题--SpirngCloud
SpringCloud 有哪些核心组件?(必会) Eureka: 注册中心, 服务注册和发现 Ribbon: 负载均衡, 实现服务调用的负载均衡 Hystrix: 熔断器 Feign: 远程调用 Zuul: 网关 Spring Cloud Config: 配置中心 (1)Eureka 提供服务注册和发现, 是注册中心. 有两个组…...
中位数贪心,3086. 拾起 K 个 1 需要的最少行动次数
一、题目 1、题目描述 给你一个下标从 0 开始的二进制数组 nums,其长度为 n ;另给你一个 正整数 k 以及一个 非负整数 maxChanges 。 Alice 在玩一个游戏,游戏的目标是让 Alice 使用 最少 数量的 行动 次数从 nums 中拾起 k 个 1 。游戏开始…...
xml_woarchive undefined symbol
最近在linux中编译一个自己写的老代码。是个C动态库。可以编译成功,但直到运行的时候才报 boost xml_woarchive undefined symbol. 解决的方法是在编译时要加上 wserialization 库。 注意,这个库有含 w 和不含 w 两个。在我这里需要使用含 w 的。 如果…...
SiCat:一款多功能漏洞利用管理与搜索工具
关于SiCat SiCat是一款多功能漏洞利用管理与搜索工具,该工具基于纯Python 3开发,旨在帮助广大研究人员有效地识别和收集来自开源和本地存储库的漏洞信息。 SiCat专注于网络安全管理方面的实践工作,允许研究人员快速实现在线搜索,…...
毕业论文初稿写作方法与过程
毕业论文初稿写作方法与过程 毕业论文是大学生在学业结束前必须完成的一项重要任务,它不仅是对学生所学知识的综合运用,也是对学生研究能力和写作能力的检验。写好毕业论文初稿是完成高质量毕业论文的关键一步。下面将具体阐述毕业论文初稿的写作方法和过…...
SLAM 精度评估
SLAM 精度的评估有两个最重要的指标,即绝对轨迹误差(ATE)和相对位姿误差(RPE)的 均方根误差(RMSE): 绝对轨迹误差:直接计算相机位姿的真实值与 SLAM 系统的估计值之间的差值,首先将…...
Postman使用教程
传统接口风格 RESTful风格 使用Postman完成测试用例目标: Postman教程 (1)准备工作,下载Postman新建 (2)登录接口调试-获取验证码 (3)登录接口调试-登录 (4)…...
UDP协议深入解析
一. UDP报文结构 UDP报文由以下4个字段组成: 源端口号(Source Port):16位,标识发送方的端口号。如果发送方没有使用端口号,则该字段为0。 目标端口号(Destination Port):16位,标识接收方的端口号。 长度(Length):16位,表示UDP报文的总长度,…...
Rethinking Federated Learning with Domain Shift: A Prototype View
CVPR2023,针对分布式数据来自不同的域时,私有模型在其他域上表现出退化性能(具有域转移)的问题。提出用于域转移下联邦学习的联邦原型学习(FPL)。核心思想是构建集群原型和无偏原型,提供富有成效的领域知识和公平的收敛目标。将样本嵌入拉近到属于相同语义的集群原型,而…...
打卡第2天----数组双指针,滑动窗口
今天是参与训练营第二天,这几道题我都看懂了,自己也能写出来了,实现思路很重要,万事开头难,希望我可以坚持下去。希望最后的结果是量变带来质变。 一、理解双指针思想 leetcode编号:977 不止是在卡尔这里…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
