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

AOSP Android14 Launcher3——底部任务栏Taskbar详解

前言:Launcher3中底部Taskbar和Navbar,或者说中文里面的术语导航栏,这几个词是很容易让人混淆的地方。本文要介绍的是Taskbar。从字面上意思来看,Taskbar就是任务栏,任务栏是Launcher3中一个重要的组件,尤其是在大屏平板设备上。

Taskbar的UI 形态

Taskbar在Launcher3中到底是指哪部分?
直接上图:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在屏幕底部显示的带有应用图标的部分就是Taskbar中的一部分,从上面LayoutInspector中可以看到,底部高度为161dp的View就是Taskbar。
在Launcher中,Taskbar的视图类是TaskbarDragLayer。

Taskbar有两种状态,一种是上图中完全展开的形态,有个术语叫UnStash状态,还有一种是只有底部一个bar条的形态,这种叫Stash状态。
在这里插入图片描述

Taskbar的显示逻辑与流程

核心目标:

Taskbar 旨在为大屏幕设备(平板电脑、折叠屏)提供类似桌面操作系统的体验,在应用运行时提供一个常驻或可按需访问的应用启动器和导航栏。

关键组件和控制器:

  1. TaskbarManager.java: 这是 Taskbar 的全局管理器

    • 职责: 决定是否应该在当前设备和配置下启用 Taskbar。监听设备状态变化(如屏幕旋转、折叠状态、导航模式切换)来判断是否需要创建或销毁 Taskbar UI。
    • 流程:TaskbarManager 确定需要 Taskbar 时(通常在 LauncherActivity 或类似上下文启动时),它会创建 TaskbarActivityContext
  2. TaskbarActivityContext.java: Taskbar 的上下文环境

    • 职责: 这是 Taskbar UI 实际运行的 Context。它负责创建 Taskbar 的主视图(TaskbarView)和 DragLayer (TaskbarDragLayer),并初始化所有的 Taskbar 控制器 (TaskbarControllers)。它还处理与 Launcher Activity 的生命周期绑定、资源获取、权限检查等。
    • 流程:
      • onCreate() 中,它会加载 Taskbar 布局 (R.layout.taskbar)。
      • 创建 TaskbarControllers 实例,该实例会聚合所有其他的子控制器。
      • 调用 TaskbarControllers.init() 来初始化所有子控制器,并建立它们之间的引用。
  3. TaskbarControllers.java: 控制器聚合器

    • 职责: 持有所有其他 Taskbar 子控制器的引用,方便它们之间相互访问和协调。提供一个统一的初始化 (init) 和销毁 (onDestroy) 入口。
    • 流程:init() 中,它会按顺序创建并初始化各个子控制器,如 TaskbarViewControllerTaskbarStashControllerNavbarButtonsViewController 等。
  4. TaskbarView.java: 核心 UI 视图

    • 职责: 继承自 ViewGroup,是容纳 Taskbar 上所有图标(应用、文件夹、预测应用)的容器。它处理图标的布局、添加、移除和更新。
    • 显示:TaskbarActivityContext 创建并添加到其 TaskbarDragLayer 中。
  5. TaskbarViewController.java: TaskbarView 的控制器

    • 职责: 管理 TaskbarView 的内容和视觉状态。
      • 从数据模型(通过 TaskbarModelCallbacks)获取应用列表并绑定到 TaskbarView 上。
      • 处理图标的点击、长按(弹出菜单,通过 TaskbarPopupController)。
      • 控制图标的 Alpha、Scale、TranslationY 等属性,用于配合 TaskbarStashController 实现收起/展开动画。
    • 流程:TaskbarControllers.init() 中被初始化,并获取对 TaskbarView 的引用。监听数据模型变化来更新 UI。
  6. TaskbarStashController.java: 收起/展开逻辑的核心控制器

    • 职责: 这是控制 Taskbar 是否应该显示为完整条、收起成一个细条 (Handle) 或完全隐藏的决策中心和动画协调者
    • 原理 (State Flags): 维护一个整数状态 mState,通过位标志 (FLAG_*) 来记录各种影响 Taskbar 可见性的条件,例如:
      • FLAG_IN_APP: 是否在第三方应用中。
      • FLAG_STASHED_IN_APP_SYSUI: 系统 UI(如通知面板)是否要求收起。
      • FLAG_STASHED_IN_APP_IME: 输入法是否显示。
      • FLAG_IN_STASHED_LAUNCHER_STATE: 当前 Launcher 状态是否要求收起 (如 AllApps)。
      • FLAG_STASHED_IN_APP_AUTO: 是否是瞬态 Taskbar (Transient) 且当前处于自动隐藏状态。
      • FLAG_STASHED_DEVICE_LOCKED: 设备是否锁定。
      • … 等等。
    • 决策 (mIsStashedPredicate): 通过一个 IntPredicate (一个函数式接口,输入 int 返回 boolean) 来判断当前 mState 的组合是否意味着 Taskbar 应该处于收起状态 (mIsStashed)。
    • 状态应用 (applyState, createApplyStateAnimator): 当外部事件(如 Launcher 状态改变、系统 UI 状态改变、用户交互等)调用 updateStateForFlag() 更新了 mState 后,会调用 applyState()applyState() 会比较新的预期收起状态 (mIsStashedPredicate.test(newState)) 和当前的视觉状态 (mIsStashed)。
      • 如果状态不一致,则调用 createAnimToIsStashed() 创建一个 AnimatorSet 来驱动 Taskbar UI 元素的动画(背景、图标、Handle 的 Alpha、Scale、Translation)。
      • 动画会平滑地过渡到新的收起/展开状态。
    • 动画类型 (@StashAnimation): 支持多种不同的收起/展开动画效果(TRANSITION_DEFAULT, TRANSITION_HOME_TO_APP, TRANSITION_HANDLE_FADE 等),根据触发场景选择不同的动画插值器和时序。
    • 瞬态 Taskbar (Transient): 对瞬态 Taskbar 有特殊处理逻辑,包括自动隐藏计时器 (mTimeoutAlarm) 和通过 updateAndAnimateTransientTaskbar() 进行显式控制。
  7. StashedHandleViewController.java & StashedHandleView.java: 收起状态 Handle 的控制器和视图

    • 职责:TaskbarStashController 决定收起 Taskbar 时,StashedHandleViewController 负责显示和管理 StashedHandleView(那个白色细条)。它控制 Handle 的 Alpha 和 Scale,实现显示/隐藏以及 Hint 动画(轻微放大提示可以展开)。
  8. TaskbarLauncherStateController.java: Launcher 状态转换器

    • 职责: 监听 Launcher 的状态变化(StateManager.addStateListener),并将 Launcher 状态(如 NORMAL, OVERVIEW, ALL_APPS)转换为 TaskbarStashController 能理解的状态标志 (FLAG_IN_STASHED_LAUNCHER_STATE, FLAG_IN_APP, FLAG_IN_OVERVIEW)。
    • 流程: 当 Launcher 状态切换时,它会调用 TaskbarStashController.updateStateForFlag() 来更新相应的标志,然后触发 TaskbarStashController.applyState() 来应用变化。
  9. TaskbarInsetsController.kt: 窗口 Insets 控制器

    • 职责: 根据 Taskbar 的收起/展开状态和类型(持久/瞬态),计算应该向应用报告的窗口 Insets(底部导航栏区域)。
    • 原理: 当 Taskbar 展开时,报告完整的高度;当收起时,通常报告 mStashedHeight(Handle 的高度),或者在某些特定情况(如持久 Taskbar + IME)下报告 0。它确保应用的内容能够正确地避让 Taskbar。
  10. TaskbarStashViaTouchController.kt: 触摸交互控制器

    • 职责: 处理用户直接在 Stashed Handle 或 Taskbar 背景区域的触摸事件,用于触发/取消瞬态 Taskbar 的自动隐藏计时器,或者启动 Hint 动画。
  11. 其他控制器:

    • NavbarButtonsViewController.java: 管理导航按钮(Back, Home, Recents)的显示、布局和点击事件。
    • TaskbarDragLayerController.java: 管理 Taskbar 的背景、圆角和 Y 轴偏移。
    • TaskbarDragController.java: 处理 Taskbar 内部或涉及 Taskbar 的拖放操作。
    • TaskbarKeyguardController.java: 处理锁屏状态对 Taskbar 的影响。
    • TaskbarPinningController.kt: 处理用户固定/取消固定持久 Taskbar 的设置。
    • TaskbarAutohideSuspendController.java: 管理自动隐藏功能的暂停状态。
    • … 等等。

加载与显示流程总结:

  1. 启动: LauncherActivity (或其他宿主) 启动。
  2. TaskbarManager 决策: TaskbarManager 判断当前设备配置是否需要 Taskbar。
  3. 创建 Context: 如果需要,TaskbarManager 创建 TaskbarActivityContext
  4. Context 初始化: TaskbarActivityContext 加载布局,创建 TaskbarDragLayerTaskbarView
  5. 控制器聚合: TaskbarActivityContext 创建 TaskbarControllers
  6. 子控制器初始化: TaskbarControllers.init() 逐个创建并初始化所有子控制器 (TaskbarViewController, TaskbarStashController, NavbarButtonsViewController 等),并建立它们之间的引用。
  7. 初始状态设定:
    • TaskbarStashController 根据初始条件(是否 Setup、是否 Phone Mode、是否瞬态、持久化设置等)设置初始的 mState 标志。
    • TaskbarLauncherStateController 获取当前的 Launcher 状态,并更新 TaskbarStashController 的相应标志。
  8. 首次应用状态: TaskbarStashController.applyState(0) 被调用,根据初始的 mState 计算出 Taskbar 应该是收起还是展开,并立即设置 UI 到对应的视觉状态(没有动画)。
  9. Insets 更新: TaskbarInsetsController 根据初始状态计算并向系统报告窗口 Insets。
  10. 数据绑定: TaskbarViewController 开始从模型加载数据并绑定到 TaskbarView 上显示图标。
  11. 事件监听与状态更新:
    • TaskbarLauncherStateController 监听 Launcher 状态变化。
    • TaskbarStashController 监听系统 UI 状态变化 (updateStateForSysuiFlags)。
    • TaskbarKeyguardController 监听锁屏状态。
    • TaskbarPinningController 监听用户 pinning 设置。
    • TaskbarStashViaTouchController 监听触摸事件。
    • 当任何影响可见性的状态发生变化时,对应的控制器会调用 TaskbarStashController.updateStateForFlag()
  12. 动画应用: TaskbarStashController.applyState() 被调用,如果计算出的收起/展开状态与当前视觉状态不同,则创建并启动动画 (mAnimator) 来平滑过渡。
  13. 持续运行: Taskbar 进入运行状态,响应用户交互(点击、长按、拖拽)、系统事件和状态变化,并由 TaskbarStashController 动态调整其可见性。

核心原理:

Taskbar 的核心原理是基于状态的可见性控制动画协调

  • 状态驱动: TaskbarStashController 通过维护一组状态标志 (mState) 来集中管理所有影响 Taskbar 是否应该收起的因素。
  • 解耦: 每个子控制器负责监听和更新自己相关的状态标志,将具体逻辑与最终的可见性决策解耦。
  • 集中决策: TaskbarStashController 根据所有标志的组合,使用 mIsStashedPredicate 做出最终的收起/展开决策。
  • 动画协调: TaskbarStashController 负责创建和管理收起/展开的 AnimatorSet,该动画集会同时驱动 Taskbar 背景、图标和 Handle 等多个 UI 元素的属性变化,实现协调一致的视觉过渡。
  • Insets 同步: TaskbarInsetsController 确保窗口 Insets 与 Taskbar 的状态(以及动画预期)保持一致,让应用能够正确布局。

这种设计使得 Taskbar 能够灵活地响应各种复杂的系统和用户状态变化,同时保持 UI 的流畅性和一致性。

相关文章:

AOSP Android14 Launcher3——底部任务栏Taskbar详解

前言:Launcher3中底部Taskbar和Navbar,或者说中文里面的术语导航栏,这几个词是很容易让人混淆的地方。本文要介绍的是Taskbar。从字面上意思来看,Taskbar就是任务栏,任务栏是Launcher3中一个重要的组件,尤其…...

QGraphicsView、QGraphicsScene和QGraphicsItem图形视图框架(五)QGraphicsView的缩放和移动

QGraphicsView自带滚动条的显示,但是大部分的需求样式都不需要滚动条,并且要通过鼠标来控制视图的缩放和移动。需要重写QGraphicsView实现。 一、相关函数 1.scale void QGraphicsView::scale(qreal sx, qreal sy) 按(sx,sy&…...

算法——果蝇算法

果蝇算法(Fruit Fly Optimization Algorithm,FOA)是一种受果蝇觅食行为启发而开发的群智能优化算法。以下从算法原理、算法流程、算法特点等方面为你详细讲述: 算法原理 果蝇本身具有优于其他物种的嗅觉和视觉。在觅食过程中&am…...

重返JAVA之路——图书管理系统

目录 一、功能介绍 二、设计模块 三、系统构建 1.book模块 2.operation模块 输入循环和验证 查找图书并处理借阅状态 未找到图书的处理 查找删除图书功能实现 未找到图书的处理 图书查找与归还 work方法实现图书信息输出 3. user模块实现 四、主菜单 一、功能介绍 …...

【16】数据结构之基于树的排序算法篇章

目录标题 选择排序简单选择排序树形选择排序 堆排序堆的定义Heap小跟堆大根堆堆的存储堆的代码设计堆排序的代码设计 排序算法综合比较 选择排序 基本思想:从待排序的序列中选出最大值或最小值,交换该元素与待排序序列的头部元素,对剩下的元…...

Uniapp:确认框

目录 一、 出现场景二、 效果展示三、具体使用 一、 出现场景 在项目的开发中,会经常出现删除数据的情况,如果直接删除的话,可能会存在误删,用户体验不好,所以需要增加一个消息提示,提醒用户是否删除。 二…...

pyswmm实现洪涝模拟

准备好.inp文件作为SWMM模型输入,调用pyswmm模块执行模拟,返回节点溢流量(flooding)作为积水量的初步表征。 代码: from pyswmm import Simulation, Nodes import pandas as pddef run_swmm_simulation(inp_file, ou…...

My Diary Pro:记录生活,珍藏回忆

我的日记My Diary Pro是一个非常好用的手机日记软件,可以使用它来记录每日生活日常,不少的用户可能都知道在生活之中可能会发生一些比较的重要的事情,实际上我们都可以将这些内容记录下来。包括个人观点,旅行游记,心情…...

CSRF(跨站请求伪造)漏洞概述

CSRF(跨站请求伪造)漏洞概述 一、​什么是 CSRF ​ 攻击者诱导已登录用户在不知情的情况下,对受信任网站执行未授权操作。 简单说:你登录着网站A,攻击者诱导你访问某个恶意链接,使网站A误以为是你自己发出的操作(比…...

[Java实战经验]对象拷贝

目录 谨慎重写clone方法重写clone()支持深拷贝带来的问题 合适的深拷贝 首先,对于不可变的类,我们不应该实现Cloneable接口,因为不可变类不需要拷贝,直接引用即可,实现Cloneable接口只会造成浪费。 对于Java可变类来说…...

WAF防火墙:构筑Web应用安全的“隐形护盾”

在数字化时代,Web应用已成为企业服务与用户交互的核心窗口。然而,随之而来的SQL注入、跨站脚本攻击(XSS)、DDoS攻击等威胁,时刻考验着网站的安全防线。Web应用防火墙(WAF)作为关键防护工具&…...

开源智慧巡检——无人机油田AI视频监控的未来之力

油田巡检,关乎能源命脉,却常受困于广袤地形、高危环境和人工效率瓶颈。管道泄漏、设备故障、非法闯入——这些隐患稍有疏忽,便可能酿成大患。传统巡检已无法满足现代油田对安全与效率的需求,而无人机油田巡检系统正以智能化之力重…...

【2025年泰迪杯数据挖掘挑战赛】B题 完整论文 模型建立与求解

目录 2025年泰迪杯数据挖掘挑战赛 B题完整论文:建模与求解 Matlab代码一、问题重述二、模型假设与符号说明2.1 模型基本假设2.2 符号说明 三、数据预处理**问题一:志愿者身体活动信息的统计分析****问题二:身体活动MET值的实时估计模型构建**…...

Chromium 134 编译指南 macOS篇:安装 Xcode(二)

1. 引言 在Chromium开发的征程中,为macOS平台构建正确的开发环境是成功编译的关键基础。继上一篇系统环境准备后,本文将重点介绍Xcode的安装与配置过程。作为macOS上不可或缺的集成开发环境(IDE),Xcode为Chromium 134的编译提供了必要的编译…...

软件定义网络(SDN):重塑未来网络的革命性架构

在当今数字化时代,网络已成为企业、云计算、5G通信和物联网(IoT)的核心基础设施。然而,传统网络架构由于其封闭、静态和分布式的特性,难以应对快速变化的业务需求。软件定义网络(Software-Defined Networki…...

Java虚拟机面试题:类加载机制

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...

OCCT 入门(3)核心模块与架构

文章目录 一、核心模块与架构1、架构概述2、核心模块3、数据流转3.1、几何创建(Geometric Primitives)3.2、拓扑构建(Topology Construction)3.3、模型处理(Modeling Algorithms)3.4、可视化(Vi…...

MAC-​​需求​​:10万订单异步执行库存扣减、短信通知。

批量任务并行处理​​ 实现,通过拆分任务、异步执行和线程池管理提升处理。 ​​10万订单异步处理方案设计​​ 基于图中代码的批量处理框架,结合订单业务需求,以下是 ​​库存扣减与短信通知的异步实现​​: ​​1. 代码实现(基于原有框架改造)​​ @Service public…...

ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 在 Java 开发中,集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景,盲目使用可能导致内存浪费、性能…...

使用Form.List且有Select组件

当在使用Form.List组件,且组件中有Select选项时,针对每一次选择,都要过滤掉那些已经选择过的选项,可能遇到的问题: 直接过滤会将每一个Select中的options选项都过滤掉,无法正常展示选择的选项 解决办法&a…...

大数据学习笔记

文章目录 1. 大数据概述1.1 大数据的特性1.2 大数据技术生态1.2.1 Hadoop 的概念特性1.2.2 Hadoop生态圈 — 核心组件与技术栈1.2.3 Hadoop生态演进趋势 2. 数据处理流程与技术栈2.1 数据采集2.1.1 日志采集工具2.1.2 实时数据流2.1.3 数据迁移 2.2 数据预处理2.2.1 批处理2.2.…...

Obsidian 文件夹体系构建 -INKA

Obsidian 文件夹体系构建 -INKA 本篇文章主要分享一下自己折腾学习实践过的 INKA 框架方法。原地址:Obsidian文件夹体系构建–INKA。 文章目录 Obsidian 文件夹体系构建 -INKA前言INKA简介INKA 理论最佳实践实际应用 反思 前言 上文 Obsidian文件夹体系构建-ACCES…...

QML与C++:基于ListView调用外部模型进行增删改查(性能优化版)

目录 引言相关阅读工程结构数据模型设计DataModel 类ContactProxyModel 类 为什么使用QSortFilterProxyModel?应用初始化与模型连接UI实现 性能分析与优化运行效果扩展思考总结下载链接 引言 在上一篇中介绍了基于ListView调用外部模型进行增删改查,本文…...

集合常用Stream操作

1、中间操作 filter()过滤 将流中的元素筛选出满足条件的元素 List<String> list Arrays.asList("abc","test","demo","frse","fesfes"); list.stream().filter(s -> s.startsWith("f")).forEach(Sy…...

ReactNative中处理安全区域问题

RN原生方案不支持android系统&#xff0c;所以在此使用三方组件react-native-safe-area-context 1、安装插件 yarn add react-native-safe-area-context2、安装完成后直接yarn ios可能会失败&#xff0c;需要先 cd ios && pod install && cd ..出来再继…...

二、The Power of LLM Function Calling

一、Function Calling 的诞生背景 1. 传统LLM的局限性 静态文本生成的不足&#xff1a;早期的LLM&#xff08;如早期版本的ChatGPT&#xff09;主要依赖预训练的知识库生成文本&#xff0c;但无法直接与外部系统或API交互。这意味着它们只能基于历史数据回答问题&#xff0c;…...

贪心算法day10(无重叠区间)

1.无重叠区间 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 代码&#xff1a; class Solution {public static int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(v1,v2)->{return v1[0]-v2[0];});int left interva…...

reactive 解构赋值给 ref

在 Vue 3 中&#xff0c;当你执行以下操作时&#xff1a; javascript const applyBasicInfo ref(); applyBasicInfo.value { ...props.applyBasicInfo }; 最终的 applyBasicInfo.value 是响应式对象&#xff0c;但与原对象 props.applyBasicInfo 的响应性完全独立&#xf…...

MongoDB简单用法

图片中 MongoDB Compass 中显示了默认的三个数据库&#xff1a; adminconfiglocal 如果在 .env 文件中配置的是&#xff1a; MONGODB_URImongodb://admin:passwordlocalhost:27017/ MONGODB_NAMERAGSAAS&#x1f4a1; 一、为什么 Compass 里没有 RAGSAAS 数据库&#xff1f;…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(4): 可能形(かのうけい)

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(4): 可能形(かのうけい) 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)~んです  復習(ふくしゅう)(2)いただけませんか 復習(ふくしゅう)(3)可能形(かのうけい)(1)1グループ:(2)2グループ…...

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…...

万字长篇————C语言指针学习汇总

经过一段时间的学习&#xff0c;我们已经接触到了C语言的很多知识了。不过目前我们接下来我们要接触C语言中一个最大的“门槛”&#xff1a;指针。 什么是指针&#xff1f; 在介绍指针之前&#xff0c;我们首先要明白变量与地址之间的关系。 举一个生活中的案例&#xff1a;一…...

day29图像处理OpenCV

文章目录 一、图像预处理6 图像色彩空间转换6.3灰色/BGR/HSV相互转化 7 彩图转灰图方法7.1 最大值法7.2 平均值法7.3 加权均值法7.4 案例 8 图像二值化处理8.1 阈值法(typecv2.THRESH_BINARY)8.2 反阈值法(THRESH_BINARY_INV)8.3 截断阈值法(THRESH_TRUNC)8.4 低阈值零处理(THR…...

Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

目录 一. 打印日志的常见三种方法&#xff1f; 1.1 手动创建 Logger 对象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用频率较低&#xff09; 二. 常见的 Logger&#xff0c;logger&#xff0c;…...

KrillinAI:视频跨语言传播的一站式AI解决方案

引言 在全球内容创作领域&#xff0c;跨语言传播一直是内容创作者面临的巨大挑战。传统的视频本地化流程繁琐&#xff0c;涉及多个环节和工具&#xff0c;不仅耗时耗力&#xff0c;还常常面临质量不稳定的问题。随着大语言模型(LLM)技术的迅猛发展&#xff0c;一款名为Krillin…...

PDF处理控件Aspose.PDF指南:使用 C# 从 PDF 文档中删除页面

需要从 PDF 文档中删除特定页面&#xff1f;本快速指南将向您展示如何仅用几行代码删除不需要的页面。无论您是清理报告、跳过空白页&#xff0c;还是在共享前自定义文档&#xff0c;C# 都能让 PDF 操作变得简单高效。学习如何以编程方式从 PDF 文档中选择和删除特定页面&#…...

在 IntelliJ IDEA 中开发 Java Web 项目时,遇到包内明明存在某个类但类名仍然爆红(显示红色错误提示)

在 IntelliJ IDEA 中开发 Java Web 项目时&#xff0c;遇到包内明明存在某个类但类名仍然爆红&#xff08;显示红色错误提示&#xff09;&#xff0c;而项目却能正常运行&#xff0c;重启 IDEA 后问题依旧&#xff0c;这通常是由以下原因及解决方法导致的&#xff1a; 1. 缓存…...

【4】k8s集群管理系列--harbor镜像仓库本地化搭建

一、harbor基本概念 ‌Harbor是一个由VMware开源的企业级Docker镜像仓库解决方案‌&#xff0c;旨在解决企业在容器化应用部署中的痛点&#xff0c;提供镜像存储、管理、安全和分发的全生命周期管理‌。Harbor扩展了Docker Registry&#xff0c;增加了企业级功能&#xff0c;如…...

Active Directory域服务管理与高级应用技术白皮书

目录 一、Active Directory核心架构解析 1.1 AD域服务核心组件 1.2 域功能级别演进 1.3 AD LDS应用场景 二、企业级域环境部署最佳实践 2.1 域控制器部署规划 2.2 高可用架构设计 2.3 客户端入域优化 三、高级域管理技术 3.1 精细化权限管理 3.2 组策略深度配置 3.3…...

OCP中的OCS operator介绍及应用示例

一、OCS operator介绍 在 Red Hat OpenShift Container Platform&#xff08;OCP4.8版之前&#xff0c;包含4.8&#xff09; 中&#xff0c;OCS Operator&#xff08;OpenShift Container Storage Operator&#xff09; 是用于在 OpenShift 集群中部署、配置和管理 OpenShift …...

Linux-服务器添加审计日志功能

#查看audit软件是否在运行(状态为active而且为绿色表示已经在运行) systemctl start auditd #如果没有在运行的话,查看是否被系统禁用 (audit为0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改为audit=1 #更新GRUB…...

ARM Cortex-M中断处理全解析

今天我们聊一聊ARM Cortex-M中断处理。在嵌入式系统中&#xff0c;中断是实现实时响应的核心机制。想象一下&#xff0c;如果没有中断&#xff1a; 按键按下时&#xff0c;系统可能忙于其他任务而错过响应通信数据到来时&#xff0c;可能因为没及时处理而丢失定时任务难以精确…...

douyin_search_tool | 用python开发的抖音关键词搜索采集软件

本软件工具仅限于学术交流使用&#xff0c;严格遵循相关法律法规&#xff0c;符合平台内容合法性&#xff0c;禁止用于任何商业用途&#xff01; 抖音作为国内颇受欢迎的短视频社交平台&#xff0c;汇聚了大量用户群体和活跃用户。分析平台上的热门视频可用于市场调研和竞品分析…...

基于FreeBSD的Unix服务器网络配置

Unix系统版本 FreeBSD-10.1-i386 网络配置 1.配置网络ip及网关 #编辑配置文件 ee /etc/rc.conf #参照如下内容设置 ifconfig_em0”inet 192.168.1.189 netmask 255.255.255.0” defaultrouter”192.168.1.1” #回到命令模式 esc #保存 a a 2.配置dns #编辑配置文件 ee /etc/…...

Margin和Padding在WPF和CSS中的不同

CSS和WPF中 margin 与 padding 在方向上的规定基本一致&#xff0c;但在使用场景和一些细节上有所不同。 CSS - 方向规定&#xff1a; margin 和 padding 属性可以分别指定上、右、下、左四个方向的值。例如 margin:10px 20px 30px 40px; 表示上外边距为10px、右外边距为20…...

JVM 概述

JVM概述 JVM的全为 Java Virtual Machine&#xff0c;但是目前的 JVM 已经不再与任何语言进行深度耦合了&#xff0c;其本质就是运行在计算机上的程序&#xff0c;职责是运行处理 Java 字节码文件。 JVM 功能 解释和运行 JVM 会对字节码文件中的指令&#xff0c;实时的解释为…...

基于django云平台的求职智能分析系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;招聘信息管理系统当然不能排除在外。求职智能分析系统是在实际应用和软件工程的开发原理之上&#xff0c;运用Python语言、爬虫技术以及Dj…...

在 Ubuntu 上通过 Docker 部署 Misskey 服务器

在这篇博客中&#xff0c;我们将探讨如何在 Ubuntu 上通过 Docker 部署 Misskey 服务器。Misskey 是一个开源的社交网络平台&#xff0c;支持丰富的社交功能&#xff0c;适合个人和小型社群使用。而 Docker 则是一个便捷的容器化平台&#xff0c;允许开发者轻松地打包、发布和运…...

Pytorch 第十五回:神经网络编码器——GAN生成对抗网络

Pytorch 第十五回&#xff1a;神经网络编码器——GAN生成对抗网络 本次开启深度学习第十五回&#xff0c;基于Pytorch的神经网络编码器。本回分享的是GAN生成对抗网络。在本回中&#xff0c;通过minist数据集来分享如何建立一个GAN生成对抗网络。接下来给大家分享具体思路。 本…...

gitlab如何查看分支的创建时间

在 GitLab 上查看分支创建时间&#xff0c;常规的界面不会直接显示&#xff0c;但可以通过以下几种方法查到准确时间&#xff1a; 方法一&#xff1a;通过 GitLab Web 界面查看首次提交时间&#xff08;近似&#xff09; 打开你的项目仓库。点击左侧的「Repository&#xff08…...