OpenHarmony 应用开发入门 (二、应用程序包结构理解及Ability的跳转,与Android的对比)

在进行应用开发前,对程序的目录及包结构的理解是有必要的。如果之前有过android开发经验的,会发现OpenHarmony的应用开发也很简单,有很多概念是相似的。下面对比android分析总结下鸿蒙的应用程序包结构,以及鸿蒙对比android的诸多亮点。从这些亮点上看,可以毫不客气的说,鸿蒙系统是对android系统的一种超越。

鸿蒙应用程序包结构

在基于Stage模型开发应用之前,开发者需要熟悉开发态的应用程序结构、以及编译打包后的应用程序包结构。

在开发中,一个应用包含一个或者多个Module,可以在DevEco Studio工程中创建一个或者多个Module。Module是应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。Module分为“Ability”和“Library”两种类型,“Ability”类型的Module对应于编译后的HAP(Harmony Ability Package);“Library”类型的Module对应于HAR(Harmony Archive),或者HSP(Harmony Shared Package)。 一个Module可以包含一个或多个UIAbility组件,如Module与UIAbility组件关系示意图所示。

Module与UIAbility组件关系示意图

从图中可以看出,一个app可以包含一个或多个Module。每个Module内,又可以包含一个或多个Ability,一个Ability中可以包含多个page页面。 鸿蒙的app,把模块化做到了极致,有着不错的结构。其中的每个Module,都是单独的可独立运行的单元,每个Module都可以单独编译为.hap包。

Module是应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。一个HarmonyOS应用/服务通常会包含一个或多个Module,因此,可以在工程中创建多个Module,每个Module分为Ability和Library两种类型。

HAP是应用安装的基本单位,包含了编译后的代码、资源、三方库及配置文件。

每个应用可以包含多个.hap文件,一个应用中的.hap文件合在一起称为一个Bundle,而bundleName就是应用的唯一标识(请参见app.json5配置文件中的bundleName标签)。

HAP可分为Entry和Feature两种类型:

  • Entry类型的HAP:是应用的主模块,在module.json5配置文件中的type标签配置为“entry”类型。在同一个应用中,同一设备类型只支持一个Entry类型的HAP,通常用于实现应用的入口界面、入口图标、主特性功能等。
  • Feature类型的HAP:是应用的动态特性模块,在module.json5配置文件中的type标签配置为“feature”类型。一个应用程序包可以包含一个或多个Feature类型的HAP,也可以不包含;Feature类型的HAP通常用于实现应用的特性功能,可以配置成按需下载安装,也可以配置成随Entry类型的HAP一起下载安装(请参见module对象内部结构中的“deliveryWithInstall”)。

打包后的HAP结构包括ets、libs、resources等文件夹和resources.index、module.json、pack.info等文件。

  • ets目录用于存放应用代码编译后的字节码文件。
  • libs目录用于存放库文件。库文件是应用依赖的第三方代码(.so二进制文件)。
  • resources目录用于存放应用的资源文件(字符串、图片等),便于开发者使用和维护,详见资源文件的使用。
  • resources.index是资源索引表,由IDE编译工程时生成。
  • module.json是HAP的配置文件,是HAP中非常重要的组成部分,内容由工程配置中的module.json5和app.json5组成。IDE会自动生成一部分默认配置,开发者按需修改其中的配置。详细字段请参见应用配置文件。
  • pack.info是Bundle中用于描述每个HAP属性的文件,例如app中的bundleName和versionCode信息、module中的name、type和abilities等信息,由IDE工具构建Bundle包时自动生成。

这样做的好处?

  • 方便开发者模块化的管理应用,好的应用一般都是模块化管理,模块之间属于松耦合关系。多HAP方便了开发者将业务划分成多个模块,每个模块放到独立的HAP中。例如支付类应用,有统一的主界面,主界面管理“扫一扫”、“收付款”、“消息”、“理财”等各个模块。其中主界面管理其他模块的逻辑在Entry包中实现,而“扫一扫”、“收付款”、“消息”和“理财”等模块在不同的Feature包中实现。可以同时开发多个Feature包,能够实现Feature包单独的开发测试,最终由Entry包统一集成Feature包的特性。

  • 方便开发者将多HAP合理地组合并部署到不同的设备上。例如应用程序包含一个Entry包和两个Featrue包(Feature1和Feature2)。其中Entry包可以部署到设备A和设备B,Feature1只能部署到设备A,Feature2包只部署到设备B上,那么开发者就可以方便的组合Entry和Feature1部署到设备A上,组合Entry和Feature2部署到设备B上。

  • 方便开发者按需加载所需模块,减少包大小。开发者可以将一个应用的某些HAP配置成按需加载。应用在启动阶段初始用不到的特性,可以配置暂不加载,当用户用到这些特性的时候,可由应用自动下载这些特性HAP,一定程度上减少应用包的大小。

多HAP的相关实例

针对多HAP开发,有以下相关实例可供参考:

多HAP(ArkTS)(API9)

鸿蒙中的Ability

鸿蒙操作系统(HarmonyOS)中的Ability是其应用程序组件模型的核心概念,它负责提供应用的特定功能和用户交互界面。在鸿蒙系统中,Ability被设计为一种更灵活、适应分布式设备间协同工作的组件,能够根据不同的设备形态和应用场景提供相应的服务。

基于Stage模型的Ability设计进一步体现了分布式和设备协同的能力。在Stage模型下,Ability主要负责提供应用程序的具体功能和服务,同时能够灵活地适应不同设备形态和用户交互场景。支持不同设备间的Ability无缝调用,例如手机上的PageAbility可以与智慧屏上的同类型Ability协同工作。

与Android的Activity对比

Activity是Android中四大组件之一,Android的应用是由一个或多个Activity组成的。活动(Activity)是一个可视化的用户界面,负责创建一个屏幕窗口,放置 UI 组件,供用户交互。假如我们打开一个应用,看到的整个界面就是一个Activity,当点击一个超链接,跳转到另一个界面,则又是一个新的Activity。

在android中的Activity的启动方法,也可以叫做Activity间的跳转,从一个Activity 跳转到另一个Activity。在Android中,Activity的启动是通过Intent来表达的,Intent是组件之间通信的媒介,专门提供组件互相调用的相关信息。

在android中,不同Activity之间的跳转,使用Intent组件。

Intent intent = new Intent(Activity.this,Activity2.class);
startActivity(intent);//或者
Intent intent = new Intent(); 
intent.setClassName(FirstActivity.this,"com.xiaozeng.launchapplication.SecondActivity");
startActivity(intent);

例如:

鸿蒙Ability之间的跳转

在应用使用场景中,当用户点击某个按钮时,应用经常需要拉起指定UIAbility组件来完成某些特定任务。下面介绍如何通过显式Want拉起应用内一个指定UIAbility组件。

Want是对象间信息传递的载体, 可以用于应用组件间的信息传递。 Want的使用场景之一是作为startAbility的参数, 其包含了指定的启动目标, 以及启动时需携带的相关数据, 如bundleName和abilityName字段分别指明目标Ability所在应用的包名以及对应包内的Ability名称。当Ability A需要启动Ability B并传入一些数据时, 可使用Want作为载体将这些数据传递给Ability B。

涉及到的一些概念:

  • UIAbility:UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。
  • UIAbilityContext:UIAbilityContext模块提供允许访问特定Ability的资源的能力,包括对Ability的启动、停止的设置、获取caller通信接口、拉起弹窗请求用户授权等。关于获取UIAbilityContext的方法,推荐使用getContext(this)方式来获取UIAbilityContext。
  • Want:Want是对象间信息传递的载体, 可以用于应用组件间的信息传递。 Want的使用场景之一是作为startAbility的参数, 其包含了指定的启动目标, 以及启动时需携带的相关数据。
  • HiLog:HiLog日志系统,让应用可以按照指定类型、指定级别、指定格式字符串输出日志内容,帮助开发者了解应用的运行状态,更好地调试程序。

api接口模块名:@ohos.app.ability.Want (Want)

导入模块

import Want from '@ohos.app.ability.Want';

基础用法:

  let want = {'deviceId': '', // deviceId为空表示本设备'bundleName': 'com.extreme.test','abilityName': 'MainAbility','moduleName': 'entry' // moduleName非必选};this.context.startAbility(want, (error) => {// 显式拉起Ability,通过bundleName、abilityName和moduleName可以唯一确定一个Abilityconsole.log('error.code = ' + error.code);})

传递参数:

let want = {bundleName: 'com.example.demo',abilityName: 'com.example.demo.MainAbility',parameters: {keyForString: 'str',},
};

当前支持类型:字符串,数字,数组,布尔,对象,文件描述符等。

具体可参考:Want的使用--文档中心

Ability之间的跳转举例:

同一个Module模块下,新建一个UIAbility:TestAbility.ts,在 modlue.json5中 abilities中添加TestAbility。

import common from '@ohos.app.ability.common'const TAG = "Test"
@Entry
@Component
struct Index {@State message: string = 'Hello World'private  context = getContext(this) as common.UIAbilityContextprivate  MyNumber: numberprivate  MyNString: string;// hello = globalThis.helloeventHub() {this.context.eventHub.emit("event", 1, "test", "hello")this.MyNString = globalThis.MyNStringthis.MyNumber = globalThis.MyNumberconsole.info(TAG, `MyNString, ${ this.MyNString}`);console.info(TAG, `MyNumber, ${ this.MyNumber}`);}startOtherAbility() {console.info(TAG, `startOtherAbility`);let want = {deviceId: '', // deviceId为空表示本设备bundleName: 'com.example.myapplication',abilityName: 'TestAbility',}try {this.context.startAbility(want).then(() => {console.info(TAG, `startAbility Success`);}).catch((err) => {console.info(TAG, `Failed: ${JSON.stringify(err)}}`);})} catch (error) {console.log("startAbility error: " + error)}}build() {Row() {Column() {Text("enter Ability").fontSize(50).fontWeight(FontWeight.Bold).onClick(()=>{this.startOtherAbility()})}.width('100%')}.height('100%')}
}

也可以在不同的模块中发起调用,但在不同的模块中调用时,需要注意些问题:

want,一定要写正确:

 let want = {deviceId: '', // deviceId为空表示本设备bundleName: 'com.example.myapplication',abilityName: 'Module1Ability',moduleName: 'module1', // moduleName非必选}

另外,还需要在菜单栏 Run->edit configureation, 选择entry,Deploy Multi Hap,选中 Deploy Multil Hap Packages,添加模块。

鸿蒙Ability的优势

尽管鸿蒙中的Ability和Android中的Activity两者都承担着展示UI和响应用户交互的功能,但鸿蒙系统的Ability更加侧重于分布式环境下的能力解耦和服务化,强调跨设备的一致性和协同性,而Android Activity则是在单一设备上构建应用的基本单元,其生命周期管理和页面跳转逻辑相对集中于单个设备内部。

基于Stage模型的Ability设计进一步体现了分布式和设备协同的能力。在Stage模型下,Ability主要负责提供应用程序的具体功能和服务,同时能够灵活地适应不同设备形态和用户交互场景。
鸿蒙 Ability基于Stage模型的特点:

Stage模型:

在鸿蒙系统中,引入了AbilityStage的概念,它是一个容器级别的组件,用于管理和调度多个Ability Slice(页面片段或子能力),类似于Android中的Fragment集合。

AbilityStage可以将一个复杂的界面划分为多个独立的功能模块(AbilitySlice),每个模块都能够独立更新和展示,并且能够在不同的设备之间进行分布式的协同工作。

多设备适配:

鸿蒙系统的Ability不仅局限于单一设备,而是支持跨设备运行和迁移,比如一个PageAbility可以在手机、平板、智慧屏等不同设备上无缝切换和运行。

生命周期管理与通信:

基于Stage模型的Ability具有更为精细和动态的生命周期管理机制,例如AbilitySlice可以根据需要激活和挂起,更加高效地利用系统资源。

Stage模型下的Ability通过Ability框架实现与其他Ability间的高效、灵活通信,支持分布式数据流和事件处理。

对比Android Activity的优势:

分布式特性:鸿蒙Ability的一个显著优势在于它的分布式能力,能更好地支持跨设备的应用开发和部署,打破单个设备的边界,实现服务在不同设备间自由流动和共享。
轻量化与灵活性:

AbilitySlice可以更细粒度地组织应用逻辑,相比于Activity,开发者可以根据实际需求将应用界面分割成更小的功能单元,这些单元可以在同一设备的不同窗口或跨设备间独立加载和呈现。

统一接口与低耦合:

鸿蒙的Ability体系结构强调的是服务化和解耦,通过统一的AbilityContext接口,使得各类型Ability之间的相互调用和数据交互更为简洁和标准化。

总结来说,鸿蒙的Ability在Stage模型的支持下,实现了对传统Activity模型的超越,尤其是在跨设备协同和资源优化方面展现出了更强的优势,更适合未来物联网环境下多形态智能设备的应用开发。

鸿蒙对比android的诸多亮点

为何说鸿蒙系统对android系统来说是一种超越?

鸿蒙系统(HarmonyOS)相较于Android系统,具有以下亮点和超越之处:

分布式架构:

鸿蒙系统的核心优势在于其分布式操作系统设计,能够实现跨设备、跨平台的无缝协同。不同形态的智能终端可以通过鸿蒙系统的分布式能力自由组合和联动,形成一个超级终端网络。相比之下,Android系统在原生状态下并未提供如此深入的分布式支持。

微内核技术:

鸿蒙系统采用微内核设计,相比Android基于Linux宏内核,它更轻量级且安全性更高。微内核仅包含操作系统最基本的服务,能更好地满足物联网设备对实时性和安全性的需求。

统一性与兼容性:

鸿蒙系统强调“万物互联”的理念,同一套系统可运行于各种不同类型的硬件设备上,包括智能手机、智能穿戴、智能家居、车机等,实现真正的全场景覆盖。而Android虽也可应用于多种设备,但往往需要针对不同设备进行深度定制和优化。

性能与流畅度提升:

鸿蒙系统采用了全新的方舟编译器(Ark Compiler),从应用编译阶段就实现了对运行效率和资源占用的优化,使得应用程序在鸿蒙系统上运行更为流畅、响应速度更快。

生态构建与拓展:

鸿蒙系统通过开放HMS Core(华为移动服务)和HarmonyOS SDK等方式,鼓励开发者创建适用于多设备环境的应用程序,以构建更加丰富多元的生态系统,并积极寻求与其他操作系统的兼容。

用户交互创新:

鸿蒙系统引入了原子化服务卡片、万能卡片等新的交互方式,使用户能够更便捷地管理和使用各类服务,同时也为开发者提供了更多的创新空间。

鸿蒙系统在设计理念和技术实现上确实展现出了对传统Android系统的超越,尤其是在跨设备协同、系统架构、性能优化以及未来IoT场景适应性等方面表现突出。不过,Android作为成熟的移动操作系统,在全球拥有庞大的用户基数和丰富的应用生态,对于鸿蒙来说,生态如果起来的话,android将没有可比性。

鸿蒙与Android 其他对比

一、APP

Android:Android应用以APK(Android Package)格式打包,包含DEX字节码、资源文件、清单文件以及其他必要的组件。

鸿蒙:鸿蒙应用以HAP(HarmonyOS Ability Package)的形式打包。一个HAP可以包含一个或多个Ability,以及描述每个Ability属性的pack.info文件。HAP是轻量化和模块化的,支持跨设备分布式部署。HarmonyOS的应用软件包以APP Pack(Application Package)形式发布,它是由一个或多个HAP(HarmonyOS Ability Package)以及描述每个HAP属性的pack.info组成。HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开。

鸿蒙 安卓 对应关系
HAP(entry 、feature) -> module(主模块、子模块),类似于App Bundle,feature可以动态下发
 HAP。

二、Ability

Activity/Ability:
Android:Activity是Android应用程序的基本构建块,用于展示用户界面并与用户交互。生命周期包括onCreate()、onStart()、onResume()等阶段。

鸿蒙:鸿蒙系统的对应概念是Ability,它也承担着显示UI、处理事件等功能,但具有更灵活的设计。Ability包括PageAbility、ServiceAbility等多种类型,并且支持基于Stage模型的AbilitySlice,适合跨设备场景。

Ability是应用所具备的能力的抽象,一个应用可以包含一个或多个Ability。Ability分为两种类型:FA(Feature Ability)和PA(Particle Ability)。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面包括Page,而PA无UI界面包括Service、Data

Page、Service、Data  ->类似android的 activity、service 、contentprovider

AbilitySlice->fragment

三、Intent/Want

Android:Intent用于启动Activity、发送广播或者传递数据,在组件间进行通信。

鸿蒙:在鸿蒙系统中,Intent的概念被扩展为Want,除了基本的启动和通信功能外,还支持更多的分布式能力,如跨设备启动Ability和传输数据。

四、库文件

1.库文件是应用依赖的第三方代码(例如so、jar、bin、har等二进制文件)

2.har->aar

五、资源文件

应用的资源文件(字符串、图片、音频等)存放于resources目录下
1.element->values
2.media->drawable-xhdpi
3.animation->anim
4.layout->layout
5.graphic->drawalbe
6.profile->raw

六、配置文件存储

Android:通常使用SharedPreferences、SQLite数据库、ContentProvider等方式存储配置信息,对于简单的键值对存储,SharedPreferences是一个常用选项。

鸿蒙:鸿蒙提供了ohos.data.storage API,支持轻量级的数据存储服务,开发者可以通过这个API实现配置文件的读写操作。

七、应用配置文件

1.配置文件 (config.json) 是应用的Ability信息,用于声明应用的Ability,以及应用所需权限等信息。

2.config.json->android的是 androidmanifest.xml

八、分布式和跨设备轮转

Android:原生Android系统对跨设备协同的支持相对有限,通过Google Play Services的一些API可实现部分跨设备功能,但并未像鸿蒙那样提供深度集成的分布式架构。

鸿蒙:鸿蒙系统的核心优势之一就是其分布式技术架构,能够轻松实现跨设备间的服务流转、资源共享及任务迁移。例如,一个应用可以在手机上启动,然后无缝切换到智慧屏上继续运行。

九、App的运行方式

Android:Android应用主要在单一设备内运行,尽管有远程控制、多屏协作等功能,但在原生层面并没有实现真正的分布式运行环境。

鸿蒙:鸿蒙系统支持应用在不同形态的智能终端之间自由迁移和联动,实现跨设备的统一管理和调度,从而适应全场景的智能生活体验。

十、pack.info

1.描述应用软件包中每个HAP的属性,由IDE编译生成
2.类似于 BuildConfig 

十一、权限管理

config.json 显示声明,动态申请。

总结来说,鸿蒙操作系统在设计之初就充分考虑了物联网和全场景智能化的需求,因此在分布式能力、跨设备协同等方面表现出更强的适应性和创新性。

其他资源

docs: OpenHarmony documentation | OpenHarmony开发者文档 - Gitee.com

docs: OpenHarmony documentation | OpenHarmony开发者文档 - Gitee.com

ArkTs接口参考--文档中心

使用显式Want启动Ability

文档中心

Stage模型下Ability的创建和使用

HarmonyOS开发(四):UIAbility组件_uiability oncreate参数详解-CSDN博客 

HarmonyOS-AppStorage:应用全局的UI状态存储-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/242252.html

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

相关文章

Ubuntu系统pycharm以及annaconda的安装配置笔记以及问题集锦(更新中)

Ubuntu 22.04系统pycharm以及annaconda的安装配置笔记以及问题集锦 pycharm安装 安装完之后桌面上并没有生成图标 后面每次启动pycharm都要到它的安装路径下的bin文件夹下, cd Downloads/pycharm-2018.1.4/bin然后使用sh命令启动脚本程序来打开pycharm sh pycha…

[C#]C# winform部署yolov8目标检测的openvino模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【openvino介绍】 OpenVINO(Open Visual Inference & Neural Network Optimization)是由Intel推出的,用于加速深度学习模型推理的工具套件。它旨在提高计算机视觉和深度学…

移动云助力智慧交通数智化升级

智慧交通是在整个交通运输领域充分利用物联网、空间感知、云计算、移动互联网等新一代信息技术,综合运用交通科学、系统方法、人工智能、知识挖掘等理论与工具,以全面感知、深度融合、主动服务、科学决策为目标,推动交通运输更安全、更高效、…

muduo网络库剖析——事件循环EventLoop类

muduo网络库剖析——事件循环EventLoop类 前情从muduo到my_muduo 概要框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库,考虑的肯定是众多情况是否可以高效满足;而作为学习者,我们需要抽取其…

鸿蒙开发系列教程(四)--ArkTS语言:基础知识

1、ArkTS语言介绍 ArkTS是HarmonyOS应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开…

Mac book air 重新安装系统验证显示 untrusted_cert_title

环境: Mac Book Air macOS Sierra 问题描述: Mac book air 重新安装系统验证显示 untrusted_cert_title 解决方案: 1.终端输入命令行输入 date 会看到一个非常旧的日期 2.更改日期为当前时间 使用以下命令来设置日期和时间&#xff1a…

若依微服务框架,富文本加入图片保存时出现JSON parse error: Unexpected character (‘/‘ (code 47)):...

若依微服务框架,富文本加入图片保存时出现JSON parse error: Unexpected character 一、问题二、解决1.修改网关配置2、对数据进行加密解密2.1安装插件2.2vue页面加密使用2.3后台解密存储 一、问题 若依微服务项目在使用富文本框的时候,富文本加入图片进…

51单片机8*8点阵屏

8*8点阵屏 8*8点阵屏是一种LED显示屏,它由8行和8列的LED灯组成。每个LED灯的开闭状态都可以独立控制,从而可以显示出数字、字母、符号、图形等信息。 8*8点阵屏的原理是通过行列扫描的方式,控制LED灯的亮灭,从而显示出所需的图案或…

[flutter]GIF速度极快问题的两种解决方法

原因: 当GIF图没有设置播放间隔时间时,电脑上会默认间隔0.1s,而flutter默认0s。 解决方法一: 将图片改为webp格式。 解决方法二: 为图片设置帧频率,添加播放间隔。例如可以使用GIF依赖组件设置每秒运行…

【ARMv8M Cortex-M33 系列 7.2 -- HardFault 问题定位 1】

请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 文章目录 问题背景堆栈对齐要求Cortex-M33 的 FPU 功能 问题背景 rt-thread 在PendSV_Handler退出的时候发生了HardFault_Handler是什么原因?且 LR 的值为0xfffffffd 堆栈对齐要求 在 ARM Cortex-M 架构中…

DNS寻址过程

用一张图详细的描述DNS寻址的过程,是高级前端进阶的网络篇: 主要是第三步要记仔细就行啦,每一步都要详细的记录下来,总结的脉络如下: 本地DNS缓存本地DNS服务器根域名服务器 顶级域名服务器再次顶级域名服务器权威域名…

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例:优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建,并在…

高级架构师是如何设计一个系统的?

架构师如何设计系统? 系统拆分 通过DDD领域模型,对服务进行拆分,将一个系统拆分为多个子系统,做成SpringCloud的微服务。微服务设计时要尽可能做到少扇出,多扇入,根据服务器的承载,进行客户端负…

原码,补码的除法

目录 一.原码的除法 (1)恢复余数法 重点看这 (2)不恢复余数法(加减交替法) 重点看这 二. 补码除法运算 重点看这 我们已经学习了如何进行原码,补码的乘法: http://t.csdnimg…

进入docker容器,vi: command not found

问题描述: 进入docker容器,查看文件执行vim 命令,报错 vim: command not found。搜索解决方案,说执行一下 apt-get install vim命令,然后又报错 Unable to locate package vim。 解决: 1.执行 npt-get up…

二次开发在线预约上门服务、预约到家系统 增加开发票功能 轮播图链接跳转 uniapp代码

客户具体要求: 1、在我的个人中心里面增加一个 开票功能,点击进去之后可以查看到能开票的订单列表,如果是个人是填写姓名电话邮箱,就是填写单位名称 税号 邮箱,提交申请到后台审核,如果审核通过后线下人工…

鸿蒙开发环境配置-Windows

背景 入局鸿蒙开发,发现在 Windows 下面配置安装相关环境并没有像 Mac 一样简单,过程中遇到了一些问题记录一下。 Devceo Studio 下载安装 目前鸿蒙的 IDE 最新版是 4.0,通过这个连接可以下载,鸿蒙4.0下载连接。选择符合我们电…

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

网络安全防护部署所需要注意的几点

顶层设计概念 考虑项目各层次和各要素&#xff0c;追根溯源&#xff0c;统揽全局&#xff0c;在最高层次上寻求问题的解决之道 顶层设计”不是自下而上的“摸着石头过河”&#xff0c;而是自上而下的“系统谋划” 网络安全分为 物理、网络、主机、应用、管理制度 边界最强 接…

微软Microsoft推出针对学生的AI练习英语口语工具”阅读教练“:Reading Coach

阅读教练官网链接&#xff1a;https://coach.microsoft.com AI工具专区&#xff1a;AI工具-喜好儿aigc 学生可以通过选择角色和设定&#xff0c;利用AI生成独特的故事&#xff0c;从而激发阅读兴趣并提高阅读流畅度。语音转文本AI能够实时分析学生的阅读流利性&#xff0c;检测…