HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问

场景介绍

典型跨应用访问数据的用户场景下,数据提供方会存在多次被拉起的情况。

为了降低数据提供方拉起次数,提高访问速度,OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式,即静默数据访问。

静默数据访问通过数据管理服务进行数据的访问和修改,无需拉起数据提供方。

数据管理服务仅支持数据库的基本访问或数据托管,如果有业务处理,需要将业务处理封装成接口,给数据访问方调用。

如果业务过于复杂,无法放到数据访问方,建议通过DataShareExtensionAbility 拉起数据提供方实现功能。

运作机制

可以通过数据管理服务进行代理访问的数据分为以下三种:

  • 持久化数据:归属于数据提供方的数据库,这类数据存储于数据提供方的沙箱,可以在数据提供方中通过声明的方式进行共享,按表为粒度配置为可以被其他应用访问的数据表。

  • 过程数据:托管在数据管理服务上的过程数据,这类数据存储于数据管理服务的沙箱,格式为json或byte数据,无人订阅10天后自动删除。

  • 动态数据:托管在设备上的动态数据,这类数据存储于内存中,设备重启之后自动删除。只限于调用enableSilentProxy和disableSilentProxy接口设置的数据。

数据类型存储位置数据格式有效期适用场景
持久化数据数据提供方的沙箱数据库中的数据表永久存储适用于数据格式类似关系型数据库的相关场景,如日程,会议等
过程数据数据管理服务的沙箱json或byte数据无人订阅10天后自动删除适用于数据有时效性且数据格式较简单的相关场景,如步数,天气,心率等
动态数据数据管理服务的内存key-value数据设备重启之后自动删除适用于动态关闭/打开静默访问通道的场景。例如:升级过程中为了保证数据正确性可以动态关闭静默访问,升级结束后再调用相关接口打开静默访问。调用接口生成的开启关闭状态,设备重启之后会清除。只限于调用enableSilentProxy和disableSilentProxy接口设置的数据

图1 静默数据访问视图

  • 和跨应用数据共享方式不同的是,静默数据访问借助数据管理服务通过目录映射方式直接读取数据提供方的配置,按规则进行预处理后,并访问数据库。

  • 数据访问方如果使用静默数据访问方式,URI需严格按照如下格式:
    datashareproxy://{bundleName}/{dataPath}

    数据管理服务会读取对应bundleName作为数据提供方应用,读取配置,进行权限校验并访问对应数据。

    dataPath为数据标识,可以自行定义,在同一个数据提供方应用中需要保持唯一。

约束与限制

  • 目前持久化数据中仅关系型数据库支持静默数据访问方式。
  • 整个系统最多同时并发16路查询,有多出来的查询请求需要排队处理。
  • 持久化数据不支持代理创建数据库,如果需要创建数据库,需要拉起数据提供方。
  • 数据提供方如果是normal级别签名的应用,配置的数据读写权限必须为system_basic及以上权限。

接口说明

以下是静默数据访问的相关接口,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,更多接口及使用方式请见 数据共享。

通用接口

接口名称描述
createDataShareHelper(context: Context, uri: string, options: DataShareHelperOptions, callback: AsyncCallback<DataShareHelper>): void创建DataShareHelper实例。

持久化数据

接口名称描述
insert(uri: string, value: ValuesBucket, callback: AsyncCallback<number>): void向目标表中插入一行数据。
delete(uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback<number>): void从数据库中删除一条或多条数据记录。
query(uri: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array<string>, callback: AsyncCallback<DataShareResultSet>): void查询数据库中的数据。
update(uri: string, predicates: dataSharePredicates.DataSharePredicates, value: ValuesBucket, callback: AsyncCallback<number>): void更新数据库中的数据记录。
addTemplate(uri: string, subscriberId: string, template: Template): void添加一个指定订阅者的数据模板。
on(type: ‘rdbDataChange’, uris: Array<string>, templateId: TemplateId, callback: AsyncCallback<RdbDataChangeNode>): Array<OperationResult订阅指定URI和模板对应的数据变更事件。

过程数据

接口名称描述
publish(data: Array<PublishedItem>, bundleName: string, version: number, callback: AsyncCallback<Array<OperationResult>>): void发布数据,将数据托管至数据管理服务。
on(type: ‘publishedDataChange’, uris: Array<string>, subscriberId: string, callback: AsyncCallback<PublishedDataChangeNode>): Array<OperationResult>订阅已发布数据的数据变更通知。

动态数据

接口名称描述
enableSilentProxy(context: Context, uri?: string): Promise<void>数据提供方动态开启静默访问。
当访问方通过静默访问调用DataShare相关接口的时候,校验静默访问的开关状态。
如果静默访问的是开启的,DataShare相关接口会执行原逻辑。
disableSilentProxy(context: Context, uri?: string): Promise<void>数据提供方来动态关闭静默访问。
当访问方通过静默访问调用DataShare相关接口的时候,校验静默访问的开关状态。
如果静默访问的是关闭的,DataShare相关接口接口将会直接返回。

持久化数据实现说明

首先,以共享一个关系型数据库为例,说明开发步骤。

数据提供方应用的开发

  1. 数据提供方需要在module.json5中的proxyData节点定义要共享的表的标识,读写权限和基本信息, 配置方法可考参考配置文件。

    表1 module.json5中proxyData节点对应的属性字段

    属性名称备注说明必填
    uri数据使用的URI,是跨应用数据访问的唯一标识。
    requiredReadPermission标识从该数据代理读取数据时所需要的权限,不配置默认不允许其他APP访问数据。支持权限可参考权限列表。
    requiredWritePermission标识从该数据代理修改数据时所需要的权限,不配置默认不允许其他APP修改数据。支持权限可参考权限列表。
    metadata数据源的信息,包含name和resource字段。
    name类型固定为"dataProperties",是配置的唯一标识。
    resource类型固定为"$profile:{fileName}",表示配置文件的名称为{fileName}.json。

    module.json5配置样例:

    "proxyData":[{"uri": "datashareproxy://com.acts.ohos.data.datasharetest/test","requiredReadPermission": "ohos.permission.GET_BUNDLE_INFO","requiredWritePermission": "ohos.permission.KEEP_BACKGROUND_RUNNING","metadata": {"name": "dataProperties","resource": "$profile:my_config"}}
    ]
    

    表2 my_config.json对应属性字段

    属性名称备注说明必填
    path指定数据源路径,目前支持关系型数据库,配置为库名/表名
    type标识数据库类型,目前支持配置为rdb,表示关系型数据库。
    scope数据库所在范围。
    1.module表示数据库位于本模块下;
    2.application表示数据库位于本应用下。

    my_config.json配置样例

    {"path": "DB00/TBL00","type": "rdb","scope": "application"
    }
    

数据访问方应用的开发

  1. 导入基础依赖包。

    import dataShare from '@ohos.data.dataShare';
    import dataSharePredicates from '@ohos.data.dataSharePredicates';
    import UIAbility from '@ohos.app.ability.UIAbility';
    import { ValuesBucket } from '@ohos.data.ValuesBucket';
    import window from '@ohos.window';
    import { BusinessError } from '@ohos.base';
    
  2. 定义与数据提供方通信的URI字符串。

    let dseUri = ('datashareproxy://com.acts.ohos.data.datasharetest/test');
    
  3. 创建工具接口类对象。

    let dsHelper: dataShare.DataShareHelper | undefined = undefined;
    let abilityContext: Context;export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {abilityContext = this.context;dataShare.createDataShareHelper(abilityContext, dseUri, {isProxy: true}, (err, data) => {dsHelper = data;});}
    }
    
  4. 获取到接口类对象后,便可利用其提供的接口访问提供方提供的服务,如进行数据的增、删、改、查等。

    // 构建一条数据
    let key1 = 'name';
    let key2 = 'age';
    let key3 = 'isStudent';
    let key4 = 'Binary';
    let valueName1 = 'ZhangSan';
    let valueName2 = 'LiSi';
    let valueAge1 = 21;
    let valueAge2 = 18;
    let valueIsStudent1 = false;
    let valueIsStudent2 = true;
    let valueBinary = new Uint8Array([1, 2, 3]);
    let valuesBucket: ValuesBucket = { key1: valueName1, key2: valueAge1, key3: valueIsStudent1, key4: valueBinary };
    let updateBucket: ValuesBucket = { key1: valueName2, key2: valueAge2, key3: valueIsStudent2, key4: valueBinary };
    let predicates = new dataSharePredicates.DataSharePredicates();
    let valArray = ['*'];
    if (dsHelper != undefined) {// 插入一条数据(dsHelper as dataShare.DataShareHelper).insert(dseUri, valuesBucket, (err, data) => {console.info(`dsHelper insert result:${data}`);});// 更新数据(dsHelper as dataShare.DataShareHelper).update(dseUri, predicates, updateBucket, (err, data) => {console.info(`dsHelper update result:${data}`);});// 查询数据(dsHelper as dataShare.DataShareHelper).query(dseUri, predicates, valArray, (err, data) => {console.info(`dsHelper query result:${data}`);});// 删除指定的数据(dsHelper as dataShare.DataShareHelper).delete(dseUri, predicates, (err, data) => {console.info(`dsHelper delete result:${data}`);});
    }
    
  5. 对指定的数据进行订阅。

    function onCallback(err: BusinessError, node: dataShare.RdbDataChangeNode) {console.info("uri " + JSON.stringify(node.uri));console.info("templateId " + JSON.stringify(node.templateId));console.info("data length " + node.data.length);for (let i = 0; i < node.data.length; i++) {console.info("data " + node.data[i]);}
    }let key21: string = "p1";
    let value21: string = "select * from TBL00";
    let key22: string = "p2";
    let value22: string = "select name from TBL00";
    let template: dataShare.Template = {predicates: {key21: value21,key22: value22,},scheduler: ""
    }
    if(dsHelper != undefined)
    {(dsHelper as dataShare.DataShareHelper).addTemplate(dseUri, "111", template);
    }
    let templateId: dataShare.TemplateId = {subscriberId: "111",bundleNameOfOwner: "com.acts.ohos.data.datasharetestclient"
    }
    if(dsHelper != undefined) {// 使用数据管理服务修改数据时触发onCallback回调,回调内容是template中的规则查到的数据let result: Array<dataShare.OperationResult> = (dsHelper as dataShare.DataShareHelper).on("rdbDataChange", [dseUri], templateId, onCallback);
    }
    

过程数据实现说明

以托管一份过程数据为例,说明开发步骤。

数据提供方应用的开发(可选)

数据提供方需要在module.json5中的proxyData节点定义过程数据的标识,读写权限和基本信息, 配置方法可考参考配置文件。

注意:

  • 该步骤为可选,可以不对module.json5中的proxyData进行配置。
  • 不配置proxyData时,托管数据不允许其他应用访问。
  • 不配置proxyData时,数据标识可以为简写,发布、订阅、查询数据可以使用简写的数据标识,如weather,可以不用全写为datashareproxy://com.acts.ohos.data.datasharetest/weather

表3 module.json5中proxyData节点对应的属性字段

属性名称备注说明必填
uri数据使用的URI,是跨应用数据访问的唯一标识。
requiredReadPermission标识从该数据代理读取数据时所需要的权限,不配置默认不允许其他APP访问数据。支持权限可参考权限列表。
requiredWritePermission标识从该数据代理修改数据时所需要的权限,不配置默认不允许其他APP访问数据。支持权限可参考权限列表。

module.json5配置样例:

"proxyData": [{"uri": "datashareproxy://com.acts.ohos.data.datasharetest/weather","requiredReadPermission": "ohos.permission.GET_BUNDLE_INFO","requiredWritePermission": "ohos.permission.KEEP_BACKGROUND_RUNNING"}
]

数据访问方应用的开发

  1. 导入基础依赖包。

    import dataShare from '@ohos.data.dataShare';
    import UIAbility from '@ohos.app.ability.UIAbility';
    import window from '@ohos.window';
    import { BusinessError } from '@ohos.base';
    
  2. 定义与数据提供方通信的URI字符串。

    let dseUri = ('datashareproxy://com.acts.ohos.data.datasharetest/weather');
    
  3. 创建工具接口类对象。

    let dsHelper: dataShare.DataShareHelper | undefined = undefined;
    let abilityContext: Context;export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {abilityContext = this.context;dataShare.createDataShareHelper(abilityContext, dseUri, {isProxy : true}, (err, data) => {dsHelper = data;});}
    }
    
  4. 获取到接口类对象后,便可利用其提供的接口访问提供方提供的服务,如进行数据的增、删、改、查等。

    // 构建两条数据,第一条为免配置的数据,仅自己使用
    let data : Array<dataShare.PublishedItem> = [{key:"city", subscriberId:"11", data:"xian"},{key:"datashareproxy://com.acts.ohos.data.datasharetest/weather", subscriberId:"11", data:JSON.stringify("Qing")}];
    // 发布数据
    if (dsHelper != undefined) {let result: Array<dataShare.OperationResult> = await (dsHelper as dataShare.DataShareHelper).publish(data, "com.acts.ohos.data.datasharetestclient");
    }
    
  5. 对指定的数据进行订阅。

    function onPublishCallback(err: BusinessError, node:dataShare.PublishedDataChangeNode) {console.info("onPublishCallback");
    }
    let uris:Array<string> = ["city", "datashareproxy://com.acts.ohos.data.datasharetest/weather"];
    if (dsHelper != undefined) {let result: Array<dataShare.OperationResult> = (dsHelper as dataShare.DataShareHelper).on("publishedDataChange", uris, "11", onPublishCallback);
    }
    

动态数据实现说明

动态数据实现静默访问只针对数据提供方。以动态开启静默访问为例,说明开发步骤。

数据提供方应用的开发

数据提供方调用开启动态开启静默访问接口,来开启静默访问功能。此接口是搭配data_share_config.json文件中isSilentProxyEnable字段进行工作的。支持的配置可参考data_share_config.json配置

注意:

  • 该步骤为可选,可以不对data_share_config.json文件中isSilentProxyEnable字段进行配置,默认为true,默认为开启静默访问功能。
  • 校验静默访问是否开启,会优先校验enableSilentProxy/disableSilentProxy接口设置的开关状态,其次会校验data_share_config.json文件中isSilentProxyEnable字段。
  • 不调用enableSilentProxy/disableSilentProxy接口时,优先会校验data_share_config.json文件中isSilentProxyEnable字段。
  • 不调用enableSilentProxy/disableSilentProxy接口,也不配置data_share_config.json文件中isSilentProxyEnable字段时,默认静默访问是开启的。
  1. 导入基础依赖包。

    import dataShare from '@ohos.data.dataShare';
    import UIAbility from '@ohos.app.ability.UIAbility';
    import window from '@ohos.window';
    
  2. 定义与数据提供方通信的URI字符串。

    let dseUri = ('datashare:///com.acts.datasharetest/entry/DB00/TBL00');
    
  3. 创建工具接口类对象。

    let abilityContext: Context;export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {abilityContext = this.context;dataShare.enableSilentProxy(abilityContext, dseUri);}
    }
    

为了能让大家更好的学习鸿蒙(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.rhkb.cn/news/295957.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。…

SOC内部集成网络MAC外设+ PHY网络芯片方案:PHY芯片基础知识

一. 简介 本文简单了解一下 "SOC内部集成网络MAC外设 PHY网络芯片方案" 这个网络硬件方案中涉及的 PHY网络芯片的基础知识。 二. PHY芯片基础知识 PHY 是 IEEE 802.3 规定的一个标准模块。 1. IEEE规定了PHY芯片的前 16个寄存器功能是一样的 前面说了&#xf…

GRU实现时间序列预测(PyTorch版)

&#x1f4a5;项目专栏&#xff1a;【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战&#xff08;附代码数据集原理介绍&#xff09; 文章目录 前言一、基于PyTorch搭建GRU模型实现风速时间序列预测二、时序数据集的制作三、数据归一化四、数据集加载器…

查看图片某点亮度

一背景 光强度的评价通常涉及对光源发出的光的量进行测量和描述。这种评价可以通过多种方式进行&#xff0c;但最常见的是使用光强单位“坎德拉”&#xff08;candela&#xff0c;cd&#xff09;来表示。坎德拉是国际单位制&#xff08;SI&#xff09;中光强度的单位&#xff…

WSL安装与使用

开启之后&#xff0c;会提示你重启电脑才能使配置生效&#xff0c;我们重启即可。 电脑重启后&#xff0c;打开Microsoft Store搜索WSL&#xff0c;既可以看到支持的操作系统&#xff0c;我们选择Ubuntu即可&#xff0c;我们选择第一个就可以。 随后我们打开&#xff0c;发现报…

第十三届蓝桥杯大赛软件赛省赛CC++大学B组

第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组 文章目录 第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组1、九进制转十进制2、顺子日期3、刷题统计4、修建灌木5、x进制减法6、统计子矩阵7、积木画8、扫雷9、李白打酒加强版10、砍竹子 1、九进制转十进制 计算器计算即可。2999292。 2、…

学习网安(19)

防火墙——安全产品 功能&#xff1a; 杀毒&#xff1a; 针对病毒&#xff0c;特征篡改系统中的文件 杀毒软件针对处理病毒程序 防火墙&#xff1a; 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 种类&#xff1a; 硬件防火墙&#xff1a; 各个网络安全厂商…

C++初阶 | [十] stack 和 queue

摘要&#xff1a;stack OJ&#xff1a;最小栈、栈的弹出压入序列&#xff1b;queue OJ&#xff1a;二叉树的层序遍历(仅思路&#xff0c;带图解)、逆波兰表达式求值&#xff1b;deque&#xff0c;模拟实现 stack 和 queue 经过对 string、vector、list 的学习&#xff0c;stack…

数字乡村创新之路:科技引领农村实现高质量发展

随着信息技术的快速发展&#xff0c;数字乡村建设已成为推动农村高质量发展的重要引擎。数字乡村通过科技创新&#xff0c;不仅改变了传统农业生产方式&#xff0c;也提升了乡村治理水平&#xff0c;为农民带来了更加便捷的生活。本文将从数字乡村的内涵、科技引领农村高质量发…

【网站项目】面向学生成绩分析系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Ruoyi-Cloud-Plus_使用Docker部署分布式微服务系统_环境准备_001---SpringCloud工作笔记200

1.首先安装docker: 如果以前安装过首先执行: yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 去卸载docker 2.安装dokcer需要的工具包…

单链表就地逆置

算法思想&#xff1a;构建一个带头结点的单链表L&#xff0c;然后访问链表中的每一个数据结点&#xff0c;将访问到的数据结点依此插入到L的头节点之后。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef s…

SSM框架学习——MVC模式与三层架构

MVC模式与三层架构 什么是MVC模式 MVC模式代表Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式。这种应用模式用于应用程序的分层开发。 Model代表存取数据的对象&#xff0c;它自身可带有逻辑&#xff0c;数据变化时更新Controller。View代表Model包含…

安达发|建材行业选择APS自动排程软件要遵循哪几点?

在建材行业中&#xff0c;选择合适的APS&#xff08;高级计划排程&#xff09;自动排程软件对于提高生产效率、减少浪费、优化资源配置和提升客户满意度至关重要。以下是选择APS自动排程软件时应遵循的几个关键点&#xff1a; 1. 行业特定需求&#xff1a;不同的建材企业可能有…

4.2学习总结

一.java学习总结 (本次java学习总结,主要总结了抽象类和接口的一些知识,和它们之间的联系和区别) 一.抽象类 1.1定义: 抽象类主要用来抽取子类的通用特性&#xff0c;作为子类的模板&#xff0c;它不能被实例化&#xff0c;只能被用作为子类的超类。 2.概括: 有方法声明&…

文献阅读:将条形码神经解剖学与空间转录分析相结合,可以识别投射神经元相关基因

文献介绍 「文献题目」 Integrating barcoded neuroanatomy with spatial transcriptional profiling enables identification of gene correlates of projections 「研究团队」 Anthony M. Zador&#xff08;美国冷泉港实验室&#xff09; 「发表时间」 2021-05-10 「发表期…

新闻管理系统(源码+文档)

新闻管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端新闻详情新闻首页分类退出登录个人中心拨打客服热线注册界面个人资料新闻评论成功 管理端用户管理分类管理新闻管理 文件包含内容 1、搭建视频 2、流程图 3、开…

基于opencv的SVM算法的车牌识别系统设计与实现

基于opencv的SVM算法的车牌识别系统设计与实现 车牌识别技术是智能交通系统中的一项关键技术&#xff0c;它能够自动识别车辆的车牌号码。本文将详细介绍如何使用Python编程语言结合OpenCV库和SVM算法来实现车牌识别系统。 系统架构 车牌识别系统主要包括以下几个模块&…

Win11电脑cpu温度过高怎么办呢

Win11电脑cpu温度过高怎么办呢&#xff1f;有时候我们感觉电脑发烫&#xff0c;担心电脑过烫会不会损坏。正常情况下&#xff0c;cpu的温度在45~65度之间&#xff0c;但不排除电脑同时开了太多软件&#xff0c;或者在玩吃鸡、英雄联盟等的大型游戏而导致温度超过85度。只要最高…