纯血鸿蒙崛起,原生Android挑战?两大操作系统巅峰对决,智能设备未来谁主沉浮?
鸿蒙HarmonyOS和原生Android系统虽然在一些方面相似,但在架构、设计理念、API、开发工具等方面存在一些差异。鸿蒙系统的目标是跨设备、分布式的操作系统,强调多设备协同和资源共享,而Android则主要集中在智能手机和移动设备领域。
下面将从几个角度对比鸿蒙和原生Android,并结合具体项目代码做对比说明。
1. 架构差异
原生Android:
Android是基于Linux 内核的移动操作系统,应用的运行环境由AndroidRuntime(ART)提供支持。Android的应用程序通常运行在单个设备上,并且系统中各种服务和组件多为单设备本地服务。
鸿蒙HarmonyOS:
鸿蒙操作系统采用了分布式架构,能够让应用在多种设备上运行,设备之间通过分布式数据管理和设备协作进行无缝连接。鸿蒙的核心是 “Ark” 引擎,支持统一的开发框架,能够将应用在不同设备之间无缝迁移。
- 多设备协同:鸿蒙的分布式能力允许应用跨设备运行,在不同设备之间共享资源,例如手机、平板、电视、甚至智能穿戴设备。
2. 开发语言与工具
原生Android:
Android主要使用Java和Kotlin作为开发语言,开发者可以使用AndroidStudio 开发Android应用。原生Android应用开发者会基于AndroidSDK 构建应用。
鸿蒙HarmonyOS:
鸿蒙系统主要使用 Java、Kotlin 和 C/C++ 作为开发语言,同时支持使用HarmonyOS特有的开发框架和 API。开发者可以使用 DevEco Studio 开发鸿蒙应用。
3. UI 构建差异
原生AndroidUI:
原生Android应用使用View和ViewGroup来构建用户界面。常见的布局有LinearLayout、RelativeLayout、ConstraintLayout等。
鸿蒙HarmonyOSUI:
鸿蒙系统提供了 Ability 和 ArkUI 来构建 UI。Ability是鸿蒙应用的核心组件,可以理解为一个类似于 Activity 的概念,ArkUI则是鸿蒙的 UI 开发框架。
与Android的 View 组件类似,鸿蒙 UI 中通过声明式的布局方式构建 UI,采用 Declarative UI 编程模式,类似于 Jetpack Compose。
4. 跨设备能力:
鸿蒙的一个重要特性是其分布式应用框架,允许应用跨设备无缝运行。通过 Ability 的定义,应用可以在多种设备间运行和协作。
示例:原生Android中的共享数据
在Android中,通常使用Intent和Bundle在应用间传递数据,或者通过ContentProvider共享数据。
// 通过 Intent 传递数据
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)
示例:鸿蒙HarmonyOS中的跨设备协作
在鸿蒙中,跨设备的数据传递和功能协作是通过 Ability 和 DistributedData 进行的。通过定义不同设备上的 Ability,应用能够在多个设备间无缝协作。
// 在鸿蒙中定义一个 BasicAbility(类似于Android的 Activity)
public class MainAbility extends Ability {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 设定主界面的布局setUIContent(ResourceTable.Layout_ability_main);}@Overridepublic void onStop() {super.onStop();}
}// 通过 DistributedData 在不同设备之间共享数据
public class DistributedDataDemo {private DistributedDatabase database;public void initialize() {// 获取 DistributedDatabase 实例database = DistributedDatabase.getInstance();}public void writeData() {// 写入数据到共享数据库database.put("key", "value");}public String readData() {// 从共享数据库读取数据return database.get("key");}
}
5. 生命周期管理
Android生命周期:
Android的生命周期管理基于Activity或Fragment的生命周期回调。比如,onCreate()、onStart()、onResume()等。
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
}@Override
protected void onResume() {super.onResume();// 页面恢复时的逻辑
}
鸿蒙生命周期:
在鸿蒙中,生命周期管理是基于Ability的。Ability类似于Android的Activity,但它具有更灵活的生命周期,允许在多个设备之间共享状态和信息。
// 在鸿蒙中定义 Ability 生命周期
public class MainAbility extends Ability {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 初始化界面setUIContent(ResourceTable.Layout_ability_main);}@Overridepublic void onActive() {super.onActive();// 能够访问到界面和用户交互的逻辑}@Overridepublic void onStop() {super.onStop();// 页面停止时的清理操作}
}
6. 应用发布和权限管理
Android权限管理:
Android应用权限在AndroidManifest.xml中进行声明。在运行时,某些权限还需要用户授权。
<uses-permissionAndroid:name="android.permission.ACCESS_FINE_LOCATION" />
鸿蒙 权限管理:
鸿蒙系统的权限管理相对更加简化,通过 DevEco Studio 提供的权限管理工具来声明和管理应用的权限。
<permission name="ohos.permission.LOCATION" />
7. 应用分发和多设备协同
鸿蒙的分发机制更加侧重于跨设备协作。鸿蒙应用不仅能够在智能手机上运行,还可以跨平板、电视、车机、穿戴设备等多个设备平台运行。通过分布式技术,鸿蒙系统能够实现同一应用在不同设备之间的无缝协作。
项目举例
下面结合一个简单的示例项目,展示如何使用鸿蒙HarmonyOS和原生Android实现相似的功能。我们将构建一个简单的应用,用户可以在一个设备(如手机)上输入数据,并将该数据同步到另一个设备(如平板或智能电视)。这将展示 鸿蒙的跨设备能力 和Android中跨设备的传统方式。
- 在一个设备上输入文本。
- 通过网络或本地存储同步文本数据到另一个设备(例如,平板)。
- 我们会分别实现Android和HarmonyOS版本,进行对比。
一、 鸿蒙HarmonyOS实现
鸿蒙系统的主要特性之一是 Ability(类似于Android中的Activity),而它的分布式特性让应用可以在多个设备之间协作。鸿蒙使用 DistributedData 来共享数据。
(1) 创建一个鸿蒙应用
在鸿蒙中,分布式应用通常涉及 Ability、DistributedDatabase、Data同步 等概念。我们将创建一个跨设备同步数据的简单例子。
第1步:创建一个新的 Ability(类似于Android的 Activity)
package com.example.harmonyapp;import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.agp.components.EditText;
import ohos.agp.components.Button;
import ohos.data.DatabaseHelper;
import ohos.data.resultset.ResultSet;
import ohos.data.dataability.DataAbilityHelper;
import ohos.data.dataability.DataAbilityPredicates;
import ohos.data.dataability.DataAbilityOperation;
import ohos.data.dataability.DataAbilityOperation.OperationType;public class MainAbility extends Ability {private EditText inputText;private Button saveButton;@Overridepublic void onStart(Intent intent) {super.onStart(intent);setUIContent(ResourceTable.Layout_ability_main);inputText = (EditText) findComponentById(ResourceTable.Id_input_text);saveButton = (Button) findComponentById(ResourceTable.Id_save_button);// Save button click listenersaveButton.setClickedListener(component -> {String text = inputText.getText();saveDataToSharedDatabase(text);});}private void saveDataToSharedDatabase(String text) {// 使用 DistributedData 保存数据,跨设备共享DataAbilityHelper dataAbilityHelper = DataAbilityHelper.creator(this);DataAbilityOperation operation = new DataAbilityOperation.Builder().withUri("dataability://com.example.harmonyapp.data/records").withValue("text", text).withOperationType(OperationType.INSERT).build();dataAbilityHelper.executeBatch(new DataAbilityOperation[] { operation });}
}
第2步:使用 DistributedData 进行数据同步
在鸿蒙系统中,数据可以通过 DistributedData 跨设备共享。例如,使用DataAbility实现跨设备数据同步。通过创建DataAbilityHelper,我们可以实现不同设备间的数据共享。
package com.example.harmonyapp.data;import ohos.data.dataability.DataAbility;
import ohos.data.dataability.DataAbilityPredicates;
import ohos.data.resultset.ResultSet;
import ohos.data.dataability.DataAbilityHelper;public class MyDataAbility extends DataAbility {@Overridepublic ResultSet query(Uri uri, String[] projection, DataAbilityPredicates predicates) {// 查询数据DataAbilityHelper helper = DataAbilityHelper.creator(this);return helper.query(uri, projection, predicates);}@Overridepublic int insert(Uri uri, ValuesBucket value) {// 插入数据DataAbilityHelper helper = DataAbilityHelper.creator(this);return helper.insert(uri, value);}
}
第3步:在布局文件中设置 UI
<!-- ability_main.xml -->
<LinearLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:orientation="vertical"ohos:width="match_parent"ohos:height="match_parent"><EditTextohos:id="$+id:input_text"ohos:hint="Enter some text"ohos:height="60vp"ohos:width="match_parent"ohos:layout_marginTop="50vp" /><Buttonohos:id="$+id:save_button"ohos:text="Save"ohos:width="match_parent"ohos:height="60vp"ohos:layout_marginTop="20vp" />
</LinearLayout>
二、原生Android实现
在Android中,我们可以使用SharedPreferences或ContentProvider来跨设备共享数据。为了简单起见,我们将使用SharedPreferences,并通过Firebase Realtime Database来同步数据到云端,使得其他设备可以读取和更新数据。
第1步:创建一个Activity
package com.example.androidapp;importAndroid.os.Bundle;
importAndroid.view.View;
importAndroid.widget.Button;
importAndroid.widget.EditText;
importAndroidx.appcompat.app.AppCompatActivity;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;public class MainActivity extends AppCompatActivity {private EditText inputText;private Button saveButton;private DatabaseReference databaseReference;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);inputText = findViewById(R.id.input_text);saveButton = findViewById(R.id.save_button);// 初始化 Firebase 数据库databaseReference = FirebaseDatabase.getInstance().getReference("sharedData");saveButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String text = inputText.getText().toString();saveDataToFirebase(text);}});}private void saveDataToFirebase(String text) {// 将数据保存到 Firebase 实时数据库databaseReference.setValue(text);}
}
第2步:在布局文件中设置 UI
<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"Android:orientation="vertical"Android:layout_width="match_parent"Android:layout_height="match_parent"><EditTextAndroid:id="@+id/input_text"Android:hint="Enter some text"Android:layout_width="match_parent"Android:layout_height="wrap_content"Android:layout_marginTop="50dp" /><ButtonAndroid:id="@+id/save_button"Android:text="Save"Android:layout_width="match_parent"Android:layout_height="wrap_content"Android:layout_marginTop="20dp" />
</LinearLayout>
第3步:使用 Firebase Realtime Database
- 在 Firebase Console 中创建一个项目,并获取 Google Services JSON 配置文件。
- 在 build.gradle 中添加 Firebase 依赖:
dependencies {implementation 'com.google.firebase:firebase-database:20.0.0'
}
- 使用 Firebase 实时数据库同步数据。
三、 对比分析
- 跨设备能力:
- 鸿蒙:通过DistributedData和Ability实现跨设备协作和数据共享,鸿蒙系统的分布式架构使得应用可以在多个设备之间同步数据并实现无缝协作。
-Android:通常通过云服务(如 Firebase)或ContentProvider实现跨设备的数据同步。在这个示例中,我们使用 Firebase Realtime Database 来同步数据,适用于多个Android设备之间。
- UI 构建:
- 鸿蒙:使用类似Activity的 Ability 来管理生命周期和 UI 组件。布局采用类似 XML 的声明式方式。
-Android:通过Activity和传统的View组件管理 UI。布局采用 XML 描述。
- 数据存储和共享:
- 鸿蒙:使用 DistributedData 和 DataAbility 来处理跨设备的数据同步。
-Android:使用SharedPreferences或Firebase等云端服务实现跨设备的数据同步。
- 开发工具:
- 鸿蒙:使用 DevEco Studio 开发,支持多种设备的协同开发。
-Android:使用AndroidStudio 开发,主要面向Android设备。
总结
通过这个示例,我们可以看到鸿蒙与Android在处理跨设备协同和数据同步时的差异。鸿蒙的分布式架构使得在多设备间同步数据变得更加容易,而Android则通过云服务(如 Firebase)实现跨设备的数据共享。在实际项目中,鸿蒙系统的分布式能力为开发跨设备协同的应用提供了更强大的支持,而Android更依赖于云服务来实现类似的功能。
- 架构差异:鸿蒙采用了分布式架构,支持多设备协作,而Android是单一设备的系统架构。
- 开发工具与语言:Android使用AndroidStudio 和 Java/Kotlin,而鸿蒙使用 DevEco Studio 和 Java/Kotlin(以及更多 C/C++ 支持)。
- UI 构建差异:Android使用传统的View和ViewGroup,而鸿蒙采用声明式 UI(类似 Jetpack Compose)。
- 跨设备能力:鸿蒙有强大的跨设备能力,通过 Ability 和 DistributedData 让应用在不同设备间协同工作,而Android通常局限于单一设备环境。
- 生命周期管理:虽然Android和鸿蒙都有类似Activity(或Ability)的生命周期管理机制,但鸿蒙更加关注跨设备和分布式生命周期的管理。
鸿蒙系统的最大特点是其跨设备协同能力和分布式应用框架,适合需要在多个设备上运行和协同工作的应用场景。Android适合单一设备的应用开发,且在移动端生态中已非常成熟。
相关文章:
纯血鸿蒙崛起,原生Android挑战?两大操作系统巅峰对决,智能设备未来谁主沉浮?
鸿蒙HarmonyOS和原生Android系统虽然在一些方面相似,但在架构、设计理念、API、开发工具等方面存在一些差异。鸿蒙系统的目标是跨设备、分布式的操作系统,强调多设备协同和资源共享,而Android则主要集中在智能手机和移动设备领域。 下面将从…...
书生实战营第四期-进阶岛第六关-MindSearch 快速部署
一、开发环境配置 1、打开codespace主页,选择Blank模板进行创建 Codespaces 2、创建conda环境隔离并安装依赖 conda create -n mindsearch python3.10 -y conda init 因为是新建的codespace,在第一次创建conda环境时,需要conda init 然后再…...
【Cadence32】PCB多层板电源、地平面层创建心得➕CM约束管理器Analyze分析显示设置➕“DP”报错DRC
【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…...
华东理工大学2001年数据结构与程序设计试题
华东理工大学2001年数据结构与程序设计试题 一、单选题(10分) 1.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用——存储方式最节省运算时间。 A.单链表 B.仅有头指针的单循环链表 Cÿ…...
WebRTC 的核心:RTCPeerConnection
WebRTC 的核心:RTCPeerConnection WebRTC 的核心:RTCPeerConnection 创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE 什么是 Candidate?收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换…...
Spring Boot 中 WebClient 的实践详解
在现代微服务架构中,服务之间的通信至关重要。Spring Boot 提供了 WebClient,作为 RestTemplate 的替代方案,用于执行非阻塞式的 HTTP 请求。本文将详细讲解 WebClient 的实践,包括配置、使用场景以及常见的优化策略,帮…...
OceanBase 社区版 4.0 离线方式升级bp1至bp2 指南(含避坑总结)
注:目前社区版对 4.0 升级 bp1至 bp2也未有完善的文档,本次升级中也是遇到不少坑,写本文也希望对OB感兴趣的可以尝试少些遇坑。 也希望对升级有更好方式建议方式的朋友一起切磋交流,以便再进一步完善升级方案。 第一次做OB的升级&…...
@ControllerAdvice 的实现原理
从源码角度分析 Spring Boot 中 ControllerAdvice 的实现原理 在 Spring Boot 开发中,ControllerAdvice 是一个非常强大的特性,允许开发者集中处理控制器中的异常、全局数据绑定和模型属性。本文将从源码的角度探讨 ControllerAdvice 的实现原理&#x…...
将当前cad图中实体复制到另一个新的dwg的块中,并插入块——CAD c#实现
本案例为:将当前cad图中实体复制到另一个cad的块中,并插入块。 目前代码尚未调试成功,找bug中...... public class Demo {[CommandMethod("xx1")]public void XXA(){// 获取当前文档和数据库Document currentDoc Application.Doc…...
MongoDB-ObjectID 生成器
前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …...
解决Vue项目打包后dist中的index.html用浏览器直接打开显示空白页或者page not found的问题
前言 默认情况下,使用 npm run build 打包后的 index.html 无法直接访问,需要nginx转发或使用node启用简单http serve等方式实现。 实际开发中,有时需临时打开前端项目,若可以直接打开打包后的文件,对某些场景下他人简…...
爬虫基础之Session和Cookie
在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且在很长时间内都不会失…...
计算机毕业设计PyFlink+Hadoop广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 Spark Hive 深度学习 机器学
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
排序算法(2):选择排序
问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 选择排序 选择排序每次从待排序序列中选出最小(或最大)的元素,将其放到序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素…...
uni-app(HBuilderX)搭建小程序流程(请求封装,下拉刷新,底部加载等)
uni-app 是一个跨平台的前端框架,用于开发多端应用。uni-app 提供了一个统一的 API,允许开发者编写一次代码,最终部署到多个平台,极大地提高了开发效率。在编写小程序的时候和原生微信开发者工具语法略有区别。 目录 一、请求工具…...
【Super Tilemap Editor使用详解】(一):创建图块集
1、在场景中创建瓦片地图之前,我们需要先创建一个图块集供地图使用。 可以在“Project”面板中创建: 也可以在Assets“” 菜单中创建: 2、创建成功之后,“Atlas Texture”是空的,我们需要选择一个图集。 3、选中插件中…...
驱动---1.DAC8552实现三角波输出
最近开始进行新项目的研发,考虑用DAC做一个前级输出,选择了DAC8552这个器件的一个模块,用了野火的指南者做主控,芯片是STM32F103VET6,主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…...
PHP中GD库的使用
由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...
【ChArUco Marker】标定板检测
目录 1.ChArUco介绍2.源码分析(opencv 4.5.4)3.ChAruco板创建(opencv 4.5.4)4.Charuco板检测(opencv 4.5.4)ChArUco检测源码(不使用标定参数) 5.ChArUco姿态估计(opencv …...
Kafka | RabbitMQ | RocketMQ | ActiveMQ 的区别和入门案例
springboot,vue,springcloudalibaba课程视频,有需要可以看看 <!-- springboot,springboot整合redis,整合rocketmq视频: --> https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source14d27ec13a473…...
TensorBoard
1、TensorFlow的TensorBoard TensorBoard是TensorFlow的一个组件,它提供了一个交互式的界面,用于可视化TensorFlow程序的训练过程和模型结构。 使用TensorBoard,你可以: 可视化训练过程中的各种指标,如损失函数、准…...
C# 中的异步编程:提升应用程序响应性和性能
C#中的异步编程(Asynchronous Programming)。异步编程是现代应用程序开发中非常重要的一个方面,它允许程序在等待长时间运行的操作(如I/O操作、网络请求等)时继续执行其他任务,从而提高应用程序的响应性和性…...
前端框架 React 与 Vue3对比 —— 技术选型
在进行前端框架React与Vue3的技术选型对比时,我们可以从以下几个方面进行综合考虑: 1. 性能比较 • Vue3 通过 Vite 打包工具实现了快速的开发和构建,同时使用了响应式系统和 Proxy 技术来提高数据响应速度。在大部分测试用例中,…...
虚拟机与Xshell5和Xftp4连接与虚拟机克隆
虚拟机与Xshell5和Xftp4连接与虚拟机克隆 虚拟机与Xshell5和Xftp4连接 虚拟机与Xshell5连接 下载Xshell5后启动出现如下界面,点击新建 新建会话输入虚拟机命名,如master,主机输入虚拟机IP,xxx.xxx.xxx.xxx然后确认,…...
华为USG系列防火墙 RESTCONF NAT配置 Python实现
目录 前言 文档下载 开启RESTCONF接口 Python 实现SNAT增删改查 查看nat映射列表 查看私网地址池 查看源地址池(公网) 查看nat映射规则 创建nat映射规则 创建私网地址池 创建源地址池 创建nat映射规则 修改NAT映射规则 删除NAT映射规则 …...
qemu安装arm64架构银河麒麟
qemu虚拟化软件,可以在一个平台上模拟另一个硬件平台,可以支持多种处理器架构。 一、安装 安装教程:https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接:https://qemu.weilnetz.de/w64/2024/ 我下载的是 …...
深入解析 Spring 框架:核心特性与应用价值
1.什么是spring? Spring 是一个开源的 Java 应用框架,由 Pivotal Software 提供支持。它为开发基于 Java 的企业级应用提供了一整套基础设施支持。Spring 框架的核心功能是依赖注入(Dependency Injection, DI),它帮助开发者实现…...
protobuf 报文编解码工具
QT实现的 protobuf 反序列化 & 序列化工具,版本号V1.2 下载链接:protobuf报文编解码工具资源-CSDN文库 源码github:ProtobufTool 使用说明: 1. 点击“加载proto文件”按钮,从本地选择 .proto文件 2. 选择消息名称ÿ…...
Milvus向量数据库06-RAG检索增强
Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程:为什么 RAG 优于传统的基于检索的方法:示例流程: 2-RAG和Elasticsearch对比3-RAG和向量数据库之…...
Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播
技术背景 好多开发者,希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务,然后低延迟播放出来。简单来说,在Unity 中实现采集 Camera 场景并推送RTMP的话,先是获取 Camera 场景数据,通过创建 RenderTe…...
标记数据集生成模型助力无数据情况下的大模型指令微调
在构建大模型应用时,通常有两种方式来改进效果,一种是构建外部知识库,利用RAG来完成。但RAG并不是万能的,对于特定领域的LLM应用,以及无需示例,就能完成特定任务等场合就需要进行微调。然而,微调…...
第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展
第六届知交会暨地博会:世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日,第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…...
vue响应式原理
对于响应式原理,我们先了解vue是一个MVVM结构的框架;也就是数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新,基于响应式原理我们可以使数据驱动视图的实现变得简单而高效 一、响…...
SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
概述 在 SwiftUI 的界面布局中,列表(List)和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道:如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到:当在 List 的…...
使用Allure作为测试报告生成器(Java+Selenium)
背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时,当需要确认UI regression issue还是selenium test case自身的问题,需要去jenkins中查log,一般得到的是“Can not find element xxx…...
【论文阅读】处理器芯片敏捷设计方法:问题与挑战
作者:包云岗老师 包云岗老师是计算机体系结构方向的大牛,推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会: 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…...
系统内核自动处理 TCP 连接(自动发送 RST 数据包来重置连接)
使用原始套接字发送了一个 SYN 数据包后,对方发送了 SYN,ACK 数据包,但系统仍然会自动发送 RST 数据包。这通常是因为操作系统内核在处理 TCP 连接时的行为。 原因分析 内核处理 TCP 连接: 即使你使用了原始套接字来发送和接收数据包&#x…...
VLDB 2024 | 时空数据(Spatial-temporal)论文总结
VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据(time series data)的相关论文,主要包含如有疏漏,欢迎大家补充。 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘…...
以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
Qt初识_对象树
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 什么是对象树 为什么要引…...
规范秩相关信息搜集Day2
系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…...
【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)
文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...
交换瓶子(图论 贪心)
1224. 交换瓶子 - AcWing题库 把每一个瓶子看成一个点,从每个瓶子向他应该在的那个位置的瓶子连一条边 通过这个方式,我们就可以连出n条边 观察可以发现这些图有特点: n个点 连成n条边 因为每个点会指向它应该在的位置的那个点ÿ…...
汽车升级到底应不应该设置“可取消“功能
最近,汽车OTA(Over-the-Air)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…...
Mac电脑钓鱼到拿下核心权限
目录 一. 前言 二. PKG后门制作阶段 2.1 环境准备 2.2 制作过程 2.3 成功上线 三 . 浏览器密码抓取 四. 权限维持 1. 手动权限维持 2. MSF自动化维持 五. 参考文章 一. 前言 攻防对抗强度和难度日益演进,传统的渗透测试思路成本逐渐提高,钓鱼已经成为当下攻击者最常…...
Docker多架构镜像构建踩坑记
背景 公司为了做信创项目的亮点,需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行,整个项目通过后端Java,前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建,于是只能手工构…...
docker 架构详解
Docker架构是基于客户端-服务器(C/S)模式的,包含多个关键组件,以确保容器化应用的高效构建、管理和运行。以下是对Docker架构的详细解析: Docker 架构概述 Docker 架构采用客户端-服务器(C/S)…...
05-标准库开发-STM32-IIC协议
七、STM32中IIC协议 概述 Inter-Integrated Circuit (IIC),也常称为I2C(I squared C),是一种同步、串行、半双工通信总线协议。它主要用于连接低速外围设备到处理器或微控制器上,如MPU6050姿态传感器、OLED显示屏、存…...
vue 封装全局过滤器
1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…...
【PlantUML系列】流程图(四)
目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字;结束一般使用stop/end关键字。基础用法包括: start ... stopstart ...…...