当前位置: 首页 > news >正文

Android SystemUI——服务启动流程(二)

        在 Andorid 系统源码中,package/apps下放的是系统内置的一些 APP,例如 Settings、Camera、Phone、Message 等等。而在 framework/base/package 下,它们也是系统的 APP,SystemUI 就在此目录下。它控制着整个 Android 系统的界面,但其实他也是一个 APP,不同于一般的 APP,它不可卸载也不可以被第三方应用替换。对于用户而言,SystemUI 的改动是最能直观感受到的。因此,每个 Android 版本在 SystemUI 上都有比较大的改动。而对开发者而言,理解 Android SystemUI 对优化 Android 系统界面,改善用户体验十分重要。

一、启动流程

        因为 SystemUI 是系统应用,所以它也是一个 APK,有入口 Application,只不过它是由 SystemServer 进程进行启动的。

1、SystemServer

        在 Android 系统之后,系统首先会启动一个名为 Zygote 的进程,而 Zygote 进程又会启动 SystemServer 进程,SystemServer 又会启动 SystemUI,这里我们先来看 SystemServer 的 main() 方法。

源码位置:/frameworks/base/services/java/com/android/server/SystemServer.java

main

public final class SystemServer implements Dumpable {……public static void main(String[] args) {new SystemServer().run();}
}

        这里启动了 run() 方法。

run

private void run() {TimingsTraceAndSlog t = new TimingsTraceAndSlog();……// Start services.try {t.traceBegin("StartServices");startBootstrapServices(t);startCoreServices(t);startOtherServices(t);} catch (Throwable ex) {……throw ex;} finally {t.traceEnd(); // StartServices}……
}

        在 run 方法中调用了startOtherServices() 方法。

startOtherServices

private void startOtherServices() {……mActivityManagerService.systemReady(() -> {……try {startSystemUi(context, windowManagerF);} catch (Throwable e) {reportWtf("starting System UI", e);}……}
}

        在 startOtherServices() 方法里面,mActivityManagerService 的 systemReady 回调方法中会创建线程去执行 startSystemUi() 方法。

startSystemUi

private static void startSystemUi(Context context, WindowManagerService windowManager) {PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);Intent intent = new Intent();intent.setComponent(pm.getSystemUiServiceComponent());intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);//Slog.d(TAG, "Starting service: " + intent);context.startServiceAsUser(intent, UserHandle.SYSTEM);windowManager.onSystemUiStarted();
}

        可以看到 startSystemUi() 方法首先获取 PackageManagerInternal 对象实例 pm,再调用 pm 的 getSystemUiServiceComponent() 方法获取 SystemUIService 组件的路径,最后再调用 startServiceAsUser() 方法启动 SystemUIService 服务。

二、启动信息详解

        这里主要通过使用 Context 和 WindowManagerService 来初始化并启动 SystemUI。

1、获取服务信息

PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
pm.getSystemUiServiceComponent();

        这里使用 LocalServices.getService() 方法来获取 PackageManagerInternal 的单例实例。然后通过 PackageManagerInternal 中的 getSystemUiServiceComponent() 方法获取 SystemUI 的包名和类名。 

PackageManagerInternal

源码位置:/frameworks/base/services/core/java/android/content/pm/PackageManagerInternal.java

public abstract class PackageManagerInternal implements PackageSettingsSnapshotProvider {……/*** 返回 SystemUI 服务组件名*/public abstract ComponentName getSystemUiServiceComponent();
}

        PackageManagerInternal 是一个抽象类,同样 getSystemUiServiceComponent() 也是抽象方法,该方法在 PackageManagerService 的内部类 PackageManagerInternalImpl 中进行了具体实现。

PackageManagerService

源码位置:/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

private class PackageManagerInternalImpl extends PackageManagerInternal {……public ComponentName getSystemUiServiceComponent() {return ComponentName.unflattenFromString(mContext.getResources().getString(com.android.internal.R.string.config_systemUIServiceComponent));}……
}

        可以看到 ComonentName 是从一个内部资源字符串com.android.internal.R.string.config_systemUIServiceComponent 获取 SystemUIService 组件完整类名的。

config.xml

源码位置:/frameworks/base/core/res/res/values/config.xml

<!-- SystemUi service component -->
<string name="config_systemUIServiceComponent" translatable="false">com.android.systemui/com.android.systemui.SystemUIService</string>

        可以发现 config_systemUIServiceComponent 这个资源字符串的具体位置和内容如上所示。

2、创建 Intent 对象

Intent intent = new Intent();
intent.setComponent(pm.getSystemUiServiceComponent());
intent.addFlags(Intent.FLAG_DEBUG_TRIADED_MISSING);
  • 创建一个新的 Intent 对象,用于描述要启动的服务。
  • 通过 setComponent() 指定了要启动的服务(即 SystemUI)的包名和类名时。
  • 通过 addFlags() 设置相关标识,FLAG_DEBUG_TRIAGED_MISSING 标志,这个标志通常用于调试目的,可以帮助追踪某些类型的错误或问题。

3、启动服务

//Slog.d(TAG, "Starting service: " + intent);
context.startServiceAsUser(intent, UserHandle.SYSTEM);
  • 注释掉的日志记录语句原本可以用来输出调试信息。
  • 使用 context.startServiceAsUser() 方法以 UserHandle.SYSTEM 用户身份启动服务。这意味着服务将以系统的名义运行,拥有更高的权限。

Context 

源码位置:/frameworks/base/core/java/android/content/Context.java 

public abstract ComponentName startServiceAsUser(Intent service, UserHandle user);

         这里调用了 startServiceAsUser() 方法来启动服务,而该方法的实现是在 ContextImpl 中实现。

ContextImpl

源码位置:/frameworks/base/core/java/android/app/ContextImpl.java

public ComponentName startServiceAsUser(Intent service, UserHandle user) {return startServiceCommon(service, false, user);
}private ComponentName startServiceCommon(Intent service, boolean requireForeground, UserHandle user) {try {// 验证服务意图是否有效validateServiceIntent(service);// 准备将 Intent 发送到另一个进程service.prepareToLeaveProcess(this);// 实际启动服务ComponentName cn = ActivityManager.getService().startService(mMainThread.getApplicationThread(), service,service.resolveTypeIfNeeded(getContentResolver()), requireForeground,getOpPackageName(), getAttributionTag(), user.getIdentifier());……return cn;} catch (RemoteException e) {throw e.rethrowFromSystemServer();}
}
  • mMainThread.getApplicationThread() 提供了当前应用线程的信息。
  • service.resolveTypeIfNeeded(getContentResolver()) 解析并确定服务的 MIME 类型(如果需要)。
  • requireForeground 决定服务是否应该以前台服务的形式启动。
  • getOpPackageName() 和 getAttributionTag() 分别提供操作包名和归属标签,用于追踪和记录目的。
  • user.getIdentifier() 指定服务启动时使用的用户 ID。

         真正的启动服务涉及到与 ActivityManagerService 的通信,后者负责管理所有应用程序的生命周期和状态。具体逻辑这里就不做过多介绍了,其中《AMS》专栏已经做了详细介绍。 

4、通知WMS

windowManager.onSystemUiStarted();

        调用 windowManager.onSystemUiStarted() 方法,通知 WindowManagerService SystemUI 已经开始启动。这一步对于确保窗口管理器和其他系统组件知道 SystemUI 的状态非常重要。

WindowManagerService 

源码位置:/frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

WindowManagerPolicy mPolicy;public void onSystemUiStarted() {mPolicy.onSystemUiStarted();
}

        WindowManagerPolicy  同样是一个接口类,具体实现是在 PhoneWindowManager 中。

PhoneWindowManager

源码位置:/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

@Override
public void onSystemUiStarted() {bindKeyguard();
}private void bindKeyguard() {synchronized (mLock) {if (mKeyguardBound) {return;}mKeyguardBound = true;}mKeyguardDelegate.bindService(mContext);
}

        这里主要功能是绑定锁屏(Keyguard)服务,为了确保 Android 设备能够在启动后立即提供安全可靠的锁屏功能,并与其他系统组件无缝协作,为用户提供一致且流畅的交互体验。

相关文章:

Android SystemUI——服务启动流程(二)

在 Andorid 系统源码中&#xff0c;package/apps下放的是系统内置的一些 APP&#xff0c;例如 Settings、Camera、Phone、Message 等等。而在 framework/base/package 下&#xff0c;它们也是系统的 APP&#xff0c;SystemUI 就在此目录下。它控制着整个 Android 系统的界面&am…...

拷贝构造函数

文章目录 一、4. 拷贝构造函数 今天我们来学习拷贝构造函数。 一、4. 拷贝构造函数 如果⼀个构造函数的第⼀个参数是自身类型的引用&#xff0c;且任何额外的参数都有默认值&#xff0c;则此叫做拷贝构造函数&#xff0c;也就是说拷贝构造是⼀个特殊的构造函数。 它的形式是这…...

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…...

面试加分项:Android Framework PMS 全面概述和知识要点

在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:PMS 基础知识 1.1 PMS 定义与工作原理 1.2 PMS 的主要任务 1.3 PMS 与相关组件的交互 第二章:PMS 的核心功能 2.1 应用安装与卸载机制 2.2 应用更新与版本管理 2.3 组件管理 第…...

征服Windows版nginx(2)

1.配置Nginx 编辑Nginx的配置文件&#xff08;通常是nginx.conf&#xff09;&#xff0c;找到安装Nginx位置&#xff0c;如下路径&#xff1a; D:\nginx-1.26.2\conf 双击打开nginx.CONF编辑&#xff0c;在http块中添加一个新的server块&#xff0c;用于指定Vue项目的静态文件…...

QML states和transitions的使用

一、介绍 1、states Qml states是指在Qml中定义的一组状态&#xff08;States&#xff09;&#xff0c;用于管理UI元素的状态转换和属性变化。每个状态都包含一组属性值的集合&#xff0c;并且可以在不同的状态间进行切换。 通过定义不同的状态&#xff0c;可以在不同的应用场…...

flask_sqlalchemy relationship 子表排序

背景&#xff1a; 使用flask_sqlalchemy 的orm 时总不可避免的遇到子表排序问题 材料&#xff1a; 省略 制作&#xff1a; 直接看下面2段代码片段&#xff08;一对多关系组合&#xff09;&#xff0c;自行理解&#xff1a; 1、多的一方实体 from .exts import db from f…...

python+pymysql

python操作mysql 一、python操作数据库 1、下载pymysql 库&#xff0c; 方法一&#xff1a;pip3 install pymysql 或pip install pymysql 方法二&#xff1a;在pycharm中setting下载pymysql 2、打开虚拟机上的数据库 3、pymysql连接 dbpymysql.Connection(host&qu…...

HAL库 中断相关函数

目录 中断相关函数 函数&#xff1a;HAL_SuspendTick()和HAL_ResumeTick() 涉及手册&#xff1a; 涉及寄存器&#xff1a; 涉及位&#xff1a; 函数&#xff1a;HAL_UART_IRQHandler(&huart3) 存在位置&#xff1a; 拓展&#xff1a; 函数&#xff1a;HAL_UARTEx…...

薪资协商注意事项

根据从AI&#xff08;豆包kimi&#xff09;中查询的内容&#xff0c;以及实际面试中的经验&#xff0c;进行整理&#xff0c;供大家参考&#xff1a; 薪资构成&#xff1a;了解薪水的固定工资、绩效、补贴、奖金及其他福利等具体构成。 进行沟通时需要确认清楚是税前还是税后沟…...

【机器学习】Kaggle实战Rossmann商店销售预测(项目背景、数据介绍/加载/合并、特征工程、构建模型、模型预测)

文章目录 1、项目背景2、数据介绍3、数据加载3.1 查看数据3.2 空数据处理3.2.1 训练数据3.2.2 测试数据3.3.3 商店数据处理3.3.4 销售时间关系 4、合并数据5、特征工程6、构建训练数据和测试数据7、数据属性间相关性系数8、提取模型训练的数据集9、构建模型9.1 定义评价函数9.2…...

简化计算步骤以减少误差

简化计算步骤以减少误差 同样一个计算问题&#xff0c;若能减少运算次数&#xff0c;既可以节省计算机的计算时间&#xff0c;还可以减小舍人误差。 例 计算 x 255 x^{255} x255的值. 如果逐个相乘要用 254 次乘法&#xff0c;但若写成 x 255 x ⋅ x 2 ⋅ x 4 ⋅ x 8 ⋅…...

利用AI大模型和Mermaid生成流程图

核心点1&#xff1a;利用大模型生成流程图的语句&#xff08;Code&#xff09; 确定业务流程&#xff1a; 用户需要明确要绘制的业务流程&#xff0c;包括主要步骤、决策点以及各步骤之间的关系。将确定的业务流程以文字形式描述出来。 生成Mermaid代码&#xff1a; 将描述好的…...

SqlServer 杂项知识整理

目录 一. decimal字段类型二. 查询时加锁 一. decimal字段类型 ⏹decimal(8,3): 整数5位&#xff0c;小数3位。一共8位。 如果输入 20&#xff0c;会自动格式化为 20.000如果输入 20.1&#xff0c;会自动格式化为 20.100 -- 给数据库新增一个字段,类型要求是decimal类型 ALT…...

【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录

一、import导入css样式 在项目文件中创建一个common文件夹&#xff0c;下面创建一个css文件夹&#xff0c;里面放上style.css文件&#xff0c;编写的是公共样式&#xff0c;我们现在要在App.vue中引入该样式。 在App.vue中引入该样式&#xff0c;这样就会使样式全局生效&#…...

Maven 中 scope=provided 和 optional=true 的区别

先说效果&#xff0c;maven依赖声明中加了<scope>provided</scope>&#xff0c;或者加了<optional>true</optional>&#xff0c;从效果上看是一样的&#xff0c;都会中断依赖传递&#xff0c;观察下图&#xff1a; 图中&#xff0c;项目B分别依赖了C和…...

自动化测试与智能化测试的区别和关系

自动化测试与智能化测试的区别和关系 在现代软件开发过程中&#xff0c;测试环节是保证软件质量的重要组成部分。随着技术的不断进步&#xff0c;传统的手工测试方法逐渐无法满足高效、精确的需求&#xff0c;自动化测试&#xff08;Automated Testing&#xff09;应运而生。近…...

django在线考试系统

Django在线考试系统是一种基于Django框架开发的在线考试平台&#xff0c;它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境&#xff0c;满足教育机构、企业、个人等不同场景下的考试需求。通过该系统&#xff0c;用…...

centos9设置静态ip

CentOS 9 默认使用 NetworkManager 管理网络&#xff0c;而nmcli是 NetworkManager 命令行接口的缩写&#xff0c;是一个用来进行网络配置、管理网络连接的命令工具&#xff0c;可以简化网络设置&#xff0c;尤其是在无头&#xff08;没有图形界面&#xff09;环境下。 1、 cd…...

使用postMessage解决iframe与父页面传参

接收传递的消息时&#xff0c;可以将 window.addEventListener(message, function(e) { console.log(e.data) }) 写法&#xff0c;更换为 window.onmessage async function(e) {} 可以避免消息发送后&#xff0c;多次接收该参数 父页面js IframeEvent(){const send …...

浅谈云计算05 | 云存储等级及其接口工作原理

一、云存储设备 在当今数字化飞速发展的时代&#xff0c;数据已然成为个人、企业乃至整个社会的核心资产。从日常生活中的珍贵照片、视频&#xff0c;到企业运营里的关键业务文档、客户资料&#xff0c;数据量呈爆炸式增长。面对海量的数据&#xff0c;如何安全、高效且便捷地存…...

DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决

01 问题复现 在DolphinScheduler中有如下一个Shell任务&#xff1a; current_timestamp() { date "%Y-%m-%d %H:%M:%S" }TIMESTAMP$(current_timestamp) echo $TIMESTAMP sleep 60 在DolphinScheduler将工作流执行策略设置为并行&#xff1a; 定时周期调度设置…...

Linux 容器漏洞

定义&#xff1a;Linux 容器漏洞是指在容器技术&#xff08;如 Docker、LXC 等&#xff09;运行环境中存在的安全弱点。这些漏洞可能存在于容器镜像本身、容器运行时&#xff08;如 runc&#xff09;、容器编排工具&#xff08;如 Kubernetes&#xff09;或者容器与主机之间的交…...

前端依赖安装指南

前端依赖安装指南 一、NVM管理工具安装 1.在 Windows 上安装 下载 NVM for Windows 的安装程序&#xff1a;(最新版本可以在 nvm-windows Releases 页面 找到)运行下载的安装程序并按步骤操作。 2.配置 NVM exe安装自动配置环境变量 3. 验证 NVM 安装 验证 NVM 是否成功…...

滑动窗口限流算法:基于Redis有序集合的实现与优化

滑动窗口限流算法是一种基于时间窗口的流量控制策略&#xff0c;它将时间划分为固定大小的窗口&#xff0c;并在每个窗口内记录请求次数。通过动态滑动窗口&#xff0c;算法能够灵活调整限流速率&#xff0c;以应对流量的波动。 算法核心步骤 统计窗口内的请求数量&#xff1…...

JavaRestClient 客户端初始化+索引库操作

1. 介绍 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 Elasticsearch目前最新版本是8.0&#xff0c;其java客户端有很大变化。不过大多数企业使用的还是8以下版本 2. 客户端初始化 在elastic…...

理解Spark中运行程序时数据被分区的过程

在Spark中&#xff0c;数据分区是指将数据集分割成多个小的子集&#xff0c;即分区&#xff0c;以便在集群的多个节点上并行处理&#xff0c;从而提高处理效率。以下通过一个具体例子来理解&#xff1a; 例子背景 假设要分析一个包含100万条销售记录的数据集&#xff0c;每条…...

【微服务】面试 7、幂等性

幂等性概念及场景 概念&#xff1a;多次调用方法或接口不改变业务状态&#xff0c;重复调用结果与单次调用一致。例如在京东下单&#xff0c;多次点击提交订单只能成功一次。场景&#xff1a;包括用户重复点击、网络波动导致多次请求、mq 消息重复消费、代码中设置失败或超时重…...

10步打造完美ASP.NET、Web API和控制台应用程序文件夹结构

一、前言 在大型项目中&#xff0c;合理的文件夹结构是项目成功的关键之一。一个好的文件夹结构就像是一座井然有序的图书馆&#xff0c;每一本书&#xff08;代码文件&#xff09;都有其固定的位置&#xff0c;让人能迅速找到所需。它可以让团队成员更容易理解和维护代码&…...

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…...

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…...

Trimble自动化激光监测支持历史遗产实现可持续发展【沪敖3D】

故事桥&#xff08;Story Bridge&#xff09;位于澳大利亚布里斯班&#xff0c;建造于1940年&#xff0c;全长777米&#xff0c;横跨布里斯班河&#xff0c;可载汽车、自行车和行人往返于布里斯班的北部和南部郊区。故事桥是澳大利亚最长的悬臂桥&#xff0c;是全世界两座手工建…...

深入解析 C++ 类型转换

简介 C 类型转换是开发者必须掌握的重要技能之一, 无论是处理隐式转换还是显式转换, 理解其背后的机制与用法至关重要. 本篇博客旨在从基础到高级全面解析 C 的类型转换, 包括实际开发中的应用场景和性能分析. 自动转换 隐式类型转换 编译器可以在无需明确指示的情况下, 将一…...

2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉

文章目录 1. 导入QXlsx库2. 使用 QXlsx库 读取 .xlsx 文件小结 网上有很多教程&#xff0c;但太费劲了&#xff0c;这里有个非常简便的好方法&#xff0c;分享给大家。 1. 导入QXlsx库 转载链接 &#xff1a;https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md…...

基于ILI9341液晶屏+STM32U5单片的显示试验

试验要求&#xff1a; 1、通过串口&#xff0c;下发两个命令 STR和PIC&#xff1b; 2、STR模式&#xff1a; &#xff08;1&#xff09;串口输入什么&#xff0c;屏幕上显示什么 &#xff08;2&#xff09;如果屏幕满&#xff0c;自动下滚 &#xff08;3&#xff09;输入回车&a…...

Vue.js组件开发-如何使用moment.js

在Vue.js组件开发中&#xff0c;需要处理日期和时间&#xff0c;moment.js 是一个非常有用的库。moment.js 提供了丰富的API来解析、验证、操作和显示日期和时间。 步骤&#xff1a; 1. 安装moment.js 首先&#xff0c;需要通过npm或yarn安装moment.js。在项目根目录下运行以…...

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API&#xff0c;可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑&#xff0c;私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量&#xff0c;为了简化网络配置&#…...

全面掌握APT、Vim和GCC:Ubuntu软件管理与开发指南

文章目录 Ubuntu 软件包管理器Ubuntu 软件包管理的基本概念常用的软件包管理器APTAPT常用命令 vimVim 的基本概念Vim 的工作模式Vim 的基本操作 gcc/gUbuntu 安装 gcc / g编译知识使用方法动静态函数库 Ubuntu 软件包管理器 在 **Ubuntu** 系统中&#xff0c;软件包管理器用于…...

项目实战--网页五子棋(用户模块)(1)

接下来我将使用Java语言&#xff0c;和Spring框架&#xff0c;实现一个简单的网页五子棋。 主要功能包括用户登录注册&#xff0c;人机对战&#xff0c;在线匹配对局&#xff0c;房间邀请对局&#xff0c;积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …...

【Ubuntu与Linux操作系统:七、系统高级管理】

第7章 系统高级管理 7.1 Linux进程管理 进程是Linux系统中的基本运行单位&#xff0c;代表一个正在执行的程序。Linux通过进程管理实现多任务并发处理&#xff0c;支持用户高效利用系统资源。 1. 进程的基本概念&#xff1a; 进程状态&#xff1a;进程在运行过程中可能处于运…...

多线程面试相关

线程基础知识 线程与进程的区别 并行和并发的区别 创建线程的方式 Runnable和Callable有什么区别 run()方法和start()方法的区别 小结 线程包含哪些状态&#xff0c;各个状态之间如何变化 线程按顺序执行 notify()和notifyAll()的区别 Java中的wait方法和sleep方法的不同 如何…...

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…...

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 &#xff08;1&#xff09;元素选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器&#xff1a;必…...

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…...

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下&#xff0c;注意&#xff1a;socket 接收信息需要异步运行&#xff1a; // port 端口号自定义一个值&#xff0c;比如 8888&#xff0c;但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…...

基于微信小程序的食堂线上预约点餐系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

算法初学者(图的存储)链式前向星

知识储备&#xff1a;概念&#xff0c;存储&#xff0c;遍历&#xff0c;最短路&#xff0c;最小生成树&#xff0c;拓扑排序-关键路径 图的存储&#xff1a;邻接矩阵&#xff0c;邻接表&#xff0c;十字链表&#xff0c;多重邻接表&#xff0c;边集数组 其中&#xff1a;邻接…...

Github 2025-01-11 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10C项目1Swift项目1Yazi - 快速终端文件管理器 创建周期:210 天开发语言:Rust协议类型:MIT LicenseStar数量:5668 个Fork数量:122…...

Leetcode 3419. Minimize the Maximum Edge Weight of Graph

Leetcode 3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;3419. Minimize the Maximum Edge Weight of Graph 1. 解题思路 这一题我的思路就是二分法&#xff0c;找到能够完成遍历的临界值即可。 但是自己实际在…...

深入理解数据库索引及其优化策略

数据库作为现代应用系统的核心组件之一&#xff0c;如何高效地存储和检索数据成为开发者关注的焦点。 在处理大规模数据时&#xff0c;数据库索引 是提升查询性能的关键技术之一。本文将深入探讨数据库索引的工作原理、常见类型、创建索引的策略以及如何优化索引&#xff0c;以…...