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

Android学习总结之应用启动流程(从点击图标到界面显示)

一、用户交互触发:Launcher 到 AMS 的跨进程通信

1. Launcher 处理点击事件(应用层)

当用户点击手机桌面上的应用图标时,Launcher(桌面应用)首先捕获点击事件。每个图标对应一个启动 Intent(通常是ACTION_MAIN + CATEGORY_LAUNCHER),Launcher 通过这个 Intent 告诉系统 “我要启动某个应用的主 Activity”。

// Launcher.java
public void onClick(View v) {Intent intent = getIntentForShortcut(v); // 获取启动 IntentstartActivitySafely(intent, null);
}private void startActivitySafely(Intent intent, Bundle options) {mContext.startActivity(intent, options); // 调用 Context.startActivity()
}

2. Context.startActivity () 转向 AMS(Framework 层)

接下来,Launcher 调用startActivity(),这个看似简单的方法会逐层向上传递,最终到达 Android 系统的 “管家”——ActivityManagerService(AMS)。AMS 是运行在系统进程中的核心服务,负责管理所有应用的 Activity 和进程。

// ContextImpl.java
public void startActivity(Intent intent, Bundle options) {// 包装 Intent 为显式 Intent(确保目标组件明确)intent = Intent.parseIntentOrNull(this, intent, 0); mMainThread.getInstrumentation().execStartActivity(this, mMainThread.getApplicationThread(), null,(Activity) null, intent, -1, options);
}// Instrumentation.java
public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token,Activity target, Intent intent, int requestCode, Bundle options) {// 通过 AMS 的代理对象发起启动请求return ActivityTaskManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,... // 省略参数);
}

二、AMS 核心逻辑:任务调度与进程管理

1. AMS.startActivity () 入口(SystemServer 进程)

AMS 作为系统服务,运行在 SystemServer 进程中,通过 Binder 接收启动请求后,首先进行权限校验和组件解析:

// ActivityTaskManagerService.java(继承 AMS)
@Override
public int startActivity(IApplicationThread caller, ...) {// 检查调用者权限(如声明的 launcher 权限)enforceNotIsolatedCaller("startActivity"); // 解析 Intent 对应的 Activity 组件(可能涉及隐式 Intent 匹配)ActivityInfo aInfo = resolveActivity(intent, ...); // 启动核心流程:创建任务栈(Task)或复用已有任务return startActivityAsUser(intent, aInfo, ..., UserHandle.getCallingUserId());
}private int startActivityAsUser(Intent intent, ActivityInfo aInfo, ...) {// 构建启动参数包 ActivityStartDataActivityStartData startData = new ActivityStartData();// 核心调度逻辑:处理 Activity 启动的状态机return mActivityStarter.startActivityMayWait(caller, -1, startData, ...);
}

2. 任务栈与 Activity 状态机(ActivityStackSupervisor)

AMS 通过 ActivityStackSupervisor 管理任务栈(TaskStack),决定是否新建任务或复用现有任务。若目标 Activity 所在进程未启动,触发 进程创建流程

// ActivityStarter.java
private int startActivityMayWait(...) {// 检查目标进程是否存在ProcessRecord targetProc = mService.getProcessRecordLocked(targetProcessName, ...);if (targetProc == null || targetProc.thread == null) {// 进程未启动,调用 Zygote 孵化新进程targetProc = startProcessLocked(targetProcessName, activityInfo.applicationInfo, ...);} else {// 进程已存在,直接通知其启动 ActivityscheduleLaunchActivityLocked(r, ...); }
}

1. 组件合法性校验

AMS 首先检查启动 Intent 对应的 Activity 是否存在(比如是否在 AndroidManifest.xml 中声明),以及调用者是否有权限启动(比如普通应用不能直接启动系统级 Activity)。如果一切合法,进入下一步。

2. 任务栈管理

每个应用的 Activity 运行在 ** 任务栈(Task)** 中。AMS 会判断目标 Activity 应该在哪个任务栈中启动:

  • 如果是冷启动(应用进程未运行),创建新的任务栈;
  • 如果是热启动(应用进程已在后台运行),则将任务栈切换到前台,复用已有进程。

3. 进程是否存在?

  • 热启动:若目标进程已存在(比如应用之前被后台保留),AMS 直接通知该进程启动 Activity。
  • 冷启动:若进程不存在,AMS 会唤醒 Android 的 “进程孵化器”——Zygote

三、Zygote 孵化应用进程:从 SystemServer 到应用进程

1. Zygote 进程的作用(.native 层)

Zygote 是 Android 进程的 “孵化器”,预加载了 Java 运行时环境和系统资源(如 Framework 类),通过 fork() 快速创建应用进程,避免重复初始化开销。
AMS 通过 ZygoteProcess 类与 Zygote 通信:

// ZygoteProcess.java
public Process.ProcessStartResult startProcess(...) {// 构建启动参数(类名通常为 "android.app.ActivityThread")String args = "--activity-thread --nice-name=" + processName; // 通过 socket 向 Zygote 发送启动请求return zygoteSendArgsAndGetResult(openZygoteSocket(), args);
}

2. 应用进程初始化(ActivityThread.main ())

Zygote fork 出的新进程会执行 ActivityThread.main(),这是应用进程的入口:

// ActivityThread.java
public static void main(String[] args) {// 初始化 Looper(UI 线程消息循环)Looper.prepareMainLooper(); // 创建 ApplicationThread(AMS 通信的 Binder 实现)ActivityThread thread = new ActivityThread(); thread.attach(false, ...); // 绑定到 AMS// 启动消息循环,处理 H  handler 的消息Looper.loop(); 
}private void attach(boolean system, ...) {// 通过 Binder 向 AMS 注册应用进程final IActivityManager am = ActivityManager.getService();am.attachApplication(mAppThread); // mAppThread 是 ApplicationThread 实例
}

       Zygote 是 Android 系统中一个特殊的进程,它在系统启动时就已创建,并预加载了 Java 运行时环境(如类加载器、JIT 编译器)和系统资源(如 Framework 核心类、字体、颜色值)。
       当 AMS 需要创建新的应用进程时,会向 Zygote 发送请求。Zygote 通过 **fork ()** 机制复制自身,生成新的应用进程。由于 fork 会共享内存数据,新进程无需重新加载基础资源,大大加快了启动速度(比直接启动一个空进程快 50% 以上)。
       新进程的入口是ActivityThread.main(),这里会初始化应用的主线程(UI 线程)和消息循环(Looper),并通过 Binder 机制向 AMS 注册自己,建立通信桥梁。 

四、应用进程启动 Activity:从创建到渲染

1. AMS 通知应用启动 Activity(跨进程回调)

AMS 通过 ApplicationThread(应用进程的 Binder 服务)回调 scheduleLaunchActivity,触发 Activity 创建:

// ApplicationThread.java(ActivityThread 内部类)
@Override
public final void scheduleLaunchActivity(IBinder token, ...) {// 发送消息到 UI 线程处理sendMessage(H.LAUNCH_ACTIVITY, r); 
}// ActivityThread.H  handler(处理消息)
private void handleLaunchActivity(ActivityClientRecord r, ...) {// 创建 Activity 实例Activity activity = performLaunchActivity(r, r.overrideConfig); if (activity != null) {// 调度 Activity 的生命周期handleResumeActivity(r.token, ..., true, ...); }
}

2. 反射创建 Activity 实例(Instrumentation 调用)

performLaunchActivity 通过反射创建 Activity,并调用 Application 和 Activity 的生命周期方法:

// ActivityThread.java
private Activity performLaunchActivity(ActivityClientRecord r, Configuration config) {// 加载 Application 类Application app = r.packageInfo.makeApplication(false, mInstrumentation); // 反射创建 Activity(关键源码)java.lang.ClassLoader cl = appContext.getClassLoader();Activity activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);// 调用 Activity.onCreate()mInstrumentation.callActivityOnCreate(activity, r.state); return activity;
}

3. 界面渲染准备:WindowManager 添加窗口

Activity 的 onResume 触发窗口添加,通过 WindowManager 将 DecorView 添加到屏幕:

// Activity.java
public void onResume() {super.onResume();// 窗口可见,通知 AMS 状态变更mWindow.makeVisible(); 
}// PhoneWindow.java
void makeVisible() {if (!mWindowAdded) {// 通过 WindowManager 添加窗口(核心方法)mWindowManager.addView(mDecor, mWindowAttributes); mWindowAdded = true;}
}

1. 创建 Application:全局初始化

应用进程启动后,首先创建Application 实例(即你在 Manifest 中声明的 Application 类,若未声明则使用系统默认)。这里会调用Application.onCreate(),进行全局初始化(如数据库连接、第三方 SDK 注册)。
注意:Application 的生命周期早于所有 Activity,且整个应用中只有一个实例。

2. 反射创建 Activity 实例

接下来,AMS 通过 Binder 通知应用进程启动目标 Activity。进程通过反射机制创建 Activity 实例(例如你的MainActivity),并按顺序调用生命周期方法:

  • Activity.onCreate():初始化界面组件(如setContentView);
  • Activity.onStart():Activity 可见但未出现在前台;
  • Activity.onResume():Activity 获取焦点,界面开始渲染。

3. 窗口系统介入:从 Activity 到屏幕显示

每个 Activity 都关联一个Window(通常是PhoneWindow),窗口中包含一个DecorView(界面的根容器,如标题栏、内容区)。当 Activity 进入onResume状态,系统通过WindowManagerDecorView添加到屏幕:

  • 计算界面布局(Measure、Layout 阶段),确定每个控件的位置和大小;
  • 调用onDraw方法绘制内容(如文字、图片、自定义图形),最终通过 Skia 引擎将绘制结果写入Surface(图形缓冲区)。

五、SurfaceFlinger 合成最终界面(图形系统)

  1. Surface 创建
    WindowManager.addView 会为 DecorView 创建 Surface,通过 SurfaceControl 与 SurfaceFlinger(系统图形服务)交互。
  2. 渲染管道
    View 的 measure/layout/draw 流程在 UI 线程执行,最终通过 Skia 将绘制指令写入 Surface,由 SurfaceFlinger 合成到屏幕缓冲区。
  3. VSYNC 同步
    Choreographer 监听屏幕垂直同步信号(60Hz),确保每帧在 16ms 内完成渲染,避免卡顿。

六、冷启动 vs 热启动:核心差异对比

阶段冷启动(进程未存在)热启动(进程已存在)
进程创建触发 Zygote fork,初始化 Application 和 Context复用已有进程,直接唤醒 Activity
AMS 调度新建 ProcessRecord,绑定 ApplicationThread查找现有 ProcessRecord,复用任务栈
生命周期调用onCreate () → onStart () → onResume () 全流程仅调用 onResume ()(若 Activity 已存在于栈顶)
耗时关键因素类加载、资源初始化、布局渲染任务栈状态恢复、界面重绘

七、面试官高频问题回答示例

问题 1:“应用启动流程中,AMS 如何与应用进程通信?”

回答:AMS 是系统的 “Activity 管家”,主要负责:

  1. 合法性校验:检查启动 Intent 对应的组件是否存在、是否有权限启动;
  2. 任务栈管理:决定 Activity 在哪个任务栈中运行,处理前后台切换;
  3. 进程调度:若应用进程未启动,触发 Zygote 创建新进程;若已启动,通知进程唤醒 Activity。
    它通过 Binder 跨进程通信,协调 Launcher、应用进程、系统图形服务等模块的协作。

问题 2:“Zygote 对启动性能的优化作用是什么?”

回答:Zygote 预加载了以下内容:

  • Java 运行时环境(ClassLoaders、JIT 编译缓存);
  • Framework 核心类(如 Activity、View);
  • 系统资源(字体、颜色值、布局参数)。
    通过 fork() 复制进程内存,避免重复初始化,使应用进程启动时间减少约 50%~70%(对比直接启动 Java 进程)。

问题 3:“冷启动时,Application 和 Activity 的创建顺序是怎样的?”

回答
严格顺序:

  1. ActivityThread.performLaunchActivity 先创建 Application(调用 Application.onCreate);
  2. 再通过反射创建 Activity 实例;
  3. 最后调用 Activity.onCreate
    注意:Application 的生命周期早于所有 Activity,且全局唯一。

问题 4:“为什么冷启动时会看到短暂白屏?”

回答
这是因为 Activity 的界面渲染需要时间。在onCreate()中调用setContentView后,系统需要经历 Measure(测量)、Layout(布局)、Draw(绘制)三个阶段,才能将界面显示到屏幕。
在界面渲染完成前,系统会显示 Activity 的主题背景(默认是白色),因此会出现短暂白屏。优化方法包括:

  • 减少onCreate()中的耗时操作;
  • 使用android:windowBackground设置过渡动画或透明背景,提升用户体验。

八、总结:启动流程的核心脉络

用户点击图标 → Launcher 解析 Intent → AMS 跨进程调度 → Zygote fork 应用进程 → 
ActivityThread 初始化 → 反射创建 Application/Activity → 调用生命周期方法 → 
WindowManager 添加窗口 → SurfaceFlinger 合成界面

感谢观看!!! 

相关文章:

Android学习总结之应用启动流程(从点击图标到界面显示)

一、用户交互触发:Launcher 到 AMS 的跨进程通信 1. Launcher 处理点击事件(应用层) 当用户点击手机桌面上的应用图标时,Launcher(桌面应用)首先捕获点击事件。每个图标对应一个启动 Intent(通…...

Vue2与Vue3不同

Vue3 设计思想与核心变化详解 一、Vue3 设计思想与 Vue2 差异对比 响应式系统重构Vue2 实现(基于 Object.defineProperty) // 在 Vue2 中,通过 data 选项返回一个对象,对象中的属性会被 Object.defineProperty 转换为响应式数据…...

《Java实战:素数检测算法优化全解析——从暴力枚举到筛法进阶》

文章目录 摘要一、需求分析二、基础实现代码与问题原始代码(暴力枚举法)问题分析 三、优化版代码与解析优化1:平方根范围剪枝优化2:偶数快速跳过完整优化代码 四、性能对比五、高阶优化:埃拉托斯特尼筛法算法思想代码实…...

解决报错:node:internal/errors:496 ErrorCaptureStackTrace(err);

报错信息 我使用npm init vuelatest创建项目时出现如下报错 node:internal/errors:496 ErrorCaptureStackTrace(err); ^ TypeError [ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module “file:///D:/develop/nodejs/node_cache/_npx/2f7e7bff16d1c534/node_modules/create-vue/loc…...

【Linux笔记】进程管理章节笔记

一、进程与线程的概念 1、进程 1)概念 进程是程序的执行实例,拥有独立的资源(如内存、文件描述符等)。每个进程在创建时会被分配唯一的进程ID,即为PID,也叫进程编号。 2)特点 资源隔离&#…...

使用Webpack搭建React项目:从零开始

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...

使用Cusor 生成 Figma UI 设计稿

一、开发环境 系统:MacOS 软件版本: Figma(网页或APP版) 注:最好是app版,网页版figma 没有选项 import from manifest app下载地址:Figma Downloads | Web Design App for Desktops & …...

前端 vs 后端:技术分工详解——从用户界面到系统逻辑的全解析

前端(Frontend) 和 后端(Backend) 是软件开发中两个核心概念,分别对应用户直接交互的部分和系统背后的逻辑处理部分。它们共同构成完整的应用程序,但分工不同。 目录 一、前端(Frontend&#xf…...

CentOS 7上配置SQL Server链接其他SQL Server服务器

概述 本文介绍在CentOS 7系统上运行的SQL Server如何链接访问其他SQL Server服务器的详细步骤,包括驱动安装、配置和连接测试。 安装必要组件 1. 安装ODBC驱动 # 安装基础ODBC组件 sudo yum install unixODBC unixODBC-devel# 添加Microsoft仓库 curl https://p…...

Scade One - 将MBD技术从少数高安全领域向更广泛的安全嵌入式软件普及

Scade One是继Scade Suite version 6自2008年起发展近20年后的首次主要改进版本。在Scade One发布的同时,Scade团队发布了一系列介绍Scade One的博客。本篇Scade One - Democratizing model-based development是其中的一部分。在后面的内容中,将复述博客…...

第十二章:容器间网络_《凤凰架构:构建可靠的大型分布式系统》

第十二章 容器间网络 一、Linux网络虚拟化基础 1. 网络命名空间(Network Namespace) 隔离网络栈:每个网络命名空间拥有独立的IP地址、路由表、防火墙规则等网络配置。实现方式:通过ip netns命令管理,容器启动时自动创…...

详解七大排序

目录 一.直接插入排序 (1)基本思想 (2)算法步骤 (3)代码实现 (4)算法特性 (5)算法优化 (6)示例演示 二.希尔排序 &#xff08…...

第八章 Python基础进阶-数据可视化(终)

此章节练习主要分为:折线图、地图、柱状图,若用户只是学习Python的基础语法知识,可以不看此章节。 主要是讲解第三方包PyEcharts技术,Python数据的可视化操作。 一.json数据格式 json的概念: (1&#x…...

【Hadoop3.1.4】完全分布式集群搭建

一、虚拟机的建立与连接 1.建立虚拟机 详情见【Linux】虚拟机的安装 把上面三个参数改掉 2.连接虚拟机 具体见【Linux】远程连接虚拟机防火墙 二、修改主机名 在Centos7中直接使用root用户执行hostnamectl命令修改,重启(reboot)后永久生…...

NLP简介及其发展历史

自然语言处理(Natural Language Processing,简称NLP)是人工智能和计算机科学领域中的一个重要分支,致力于实现人与计算机之间自然、高效的语言交流。本文将介绍NLP的基本概念以及其发展历史。 一、什么是自然语言处理&#xff1f…...

Java异步编程中的CompletableFuture介绍、常见错误及最佳实践

一、Future接口的局限性 Java 5引入的Future接口为异步编程提供了基础支持,但其设计存在明显局限性,导致复杂场景下难以满足需求: 阻塞获取结果 必须通过future.get()阻塞线程等待结果,无法实现真正的非阻塞: Executo…...

基于FLask的共享单车需求数据可视化分析系统

【FLask】基于FLask的共享单车需求数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统能够整合并处理大量共享单车使用数据,通过直观的可视化手段&#xff0…...

vue2项目中,多个固定的请求域名 和 通过url动态获取到的ip域名 封装 axios

vue2 使用场景:项目中,有固定的请求域名,而有某些接口是其他域名 /utils/request.js 固定请求域名 import axios from axios import Vue from vuelet baseURL switch (window.location.hostname) {case localhost: // 本地case 127.0.0.1…...

【嵌入式学习3】基于python的tcp客户端、服务器

目录 1、tcp客户端 2、tcp服务器 3、服务器多次连接客户端、多次接收信息 1、tcp客户端 """ tcp:客户端 1. 导入socket模块 2. 创建socket套接字 3. 建立tcp连接(和服务端建立连接) 4. 开始发送数据(到服务端) 5. 关闭套接字 """ import soc…...

tomcat构建源码环境

一. IDEA运行Tomcat8源码 参考网址:https://blog.csdn.net/yekong1225/article/details/81000446 ​ Tomcat作为J2EE的开源实现,其代码具有很高的参考价值,我们可以从中汲取很多的知识。作为Java后端程序员,相信有很多人很想了解…...

你用的是Bing吗?!

🔥【深度解析】微软Bing革命性升级!Copilot Search上线:从此搜索≠找链接,而是直接生成答案! 💡 你是否厌倦了这样的搜索体验? 搜索「Python处理JSON」,在10个网页间反复跳转想对比…...

拍摄的婚庆视频有些DAT的视频文件打不开怎么办

3-12 现在的婚庆公司大多提供结婚的拍摄服务,或者有一些第三方公司做这方面业务,对于视频拍摄来说,有时候会遇到这样一种问题,就是拍摄下来的视频文件,然后会有一两个视频文件是损坏的,播放不了&#xff0…...

Oracle Cloud (OCI) 服务器最新控制台启用 IPv6 超详细图文指南(2025最新实践)

本文为原作者发布到第三方平台,更多内容参考: 🚀 Oracle Cloud (OCI) 服务器最新控制台启用 IPv6 超详细图文指南(2025最新实践) 随着 IPv6 的普及,IPv6的优秀特性能为你的 OCI 云服务器提升网络性能和路由效率,并提升兼容性。本指南将引导你在 Oracle Cloud Infrast…...

YOLO环境搭建,win11+wsl2+ubuntu24+cuda12.6+idea

提示:环境搭建 文章目录 前言一、 win11 gpu 驱动更新1.1 下载驱动3. 验证, 二、配置子系统 ubuntu2.1 安装 cuda 三、配置 anaconda四、idea 配置使用 wsl ubuntu conda 环境 前言 提示:版本 win11 wsl2 ubuntu24 idea 2024 子系统跳过&…...

类 和 对象 的介绍

对象的本质是一种新的数据类型。类是一个模型,对象是类的一个具体化实例。为类创建实例也就是创建对象。 一、类(class) 类决定一个对象将是什么样的(有什么属性、功能)。类和变量一样,有名字。 1.创建类 …...

机器学习(1)—线性回归

文章目录 1. 算法定义2. 模型形式2.1. 简单线性回归(单变量):2.2. 多元线性回归(多变量): 3. 基本原理3.1. 误差函数:3.2. 求解回归系数 4. 假设条件5. 模型评估6. 优缺点7. 扩展方法8. 应用场景…...

macOS下SourceInsight的替代品

macOS 推荐的几款开源、轻量级、且功能类似于 SourceInsight 的源码阅读工具(排除 VS Code): 1. Zeal(离线文档 简单代码导航) 官网/GitHub: https://zealdocs.org/特点: 轻量级离线文档浏览器&#xff0…...

form实现pdf文件转换成jpg文件

说明: 我希望将pdf文件转换成jpg文件 请去下载并安装 Ghostscript,gs10050w64.exe 配置环境变量:D:\Program Files\gs\gs10.05.0\bin 本地pdf路径:C:\Users\wangrusheng\Documents\name.pdf 输出文件目录:C:\Users\wan…...

聊天室项目之http知识

一.http的核心组成部分(都分成请求的和响应的) 1.起始行:请求------------------------ 方法(Method):GET、POST、PUT、DELETE 等。 请求目标(Request Target):URL 路径…...

kubeadm部署 Kubernetes(k8s) 高可用集群 V1.28.2

1. 安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 10台机器,操作系统Openeuler22.03 LTS SP4硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多,docker 数据卷单独挂…...

BUUCTF-web刷题篇(12)

21.easy_tornado Tornado大致可以分为四个主要组成部分: 一个web框架(包括RequestHandler创建Web应用程序的子类,以及各种支持类)。 HTTPServerHTTP(和AsyncHTTPClient)的客户端和服务器端实现。 一个异…...

基于 Netty 框架的 Java TCP 服务器端实现,用于启动一个 TCP 服务器来处理客户端的连接和数据传输

代码: package com.example.tpson_tcp;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; imp…...

【Kafka基础】Kafka配置文件关键参数解析与单机生产环境配置指南

1 Kafka配置文件概述 Apache Kafka的配置文件是控制其行为的关键所在,合理的配置能够显著提升性能、可靠性和可维护性。Kafka主要涉及两个核心配置文件: server.properties:Broker主配置文件zookeeper.properties:ZooKeeper配置文…...

Kafka 漏消费和重复消费问题

Kafka 虽然是一个高可靠、高吞吐的消息系统,但如果使用不当,**“漏消费”和“重复消费”**问题是非常容易发生的,尤其在业务系统中会造成数据丢失、重复写库等严重问题。 🎯 一句话理解: Kafka 本身提供 “至多一次”…...

Mysql慢查询设置 和 建立索引

1 .mysql慢查询的设置 slow_query_log ON //或 slow_query_log_file /usr/local/mysql/data/slow.log long_query_time 2 修改后重启动mysql 1.1 查看设置后的参数 mysql> show variables like slow_query%; --------------------------------------------------…...

Windows程序中计时器WM_TIMER消息的使用

本文章是对《Windows程序设计》这本书第八章计时器的总结,如果有时间,可以去看书里的讲解,如果时间不充裕,想马上知道计时器该如何使用,欢迎阅读本文,本文已经将计时器的干货整理完毕! 什么是计…...

关于apple ios苹果mdm监管锁的漏洞与修复

前言 本人从2020年开始接触苹果mdm管理系统的开发 起初只是接触如何利用mdm进行app分发 23年开始开发mdm监管锁业务 随着手机租赁的市场兴起 mdm监管锁系统随即而生 注意 本人只是分享工作过程中遇到的一些问题 不接受苹果手机屏蔽以及解锁的业务 此文章仅做分享使用 MDM监…...

使用Geotools中的原始方法来操作PostGIS空间数据库

目录 前言 一、原生PostGIS连接介绍 1、连接参数说明 2、创建DataStore 二、工程实战 1、Maven Pom.xml定义 2、空间数据库表 3、读取空间表的数据 三、总结 前言 在当今数字化与信息化飞速发展的时代,空间数据的处理与分析已成为众多领域不可或缺的一环。从…...

C-S模式之实现一对一聊天

天天开心!!! 文章目录 一、如何实现一对一聊天?1. 服务器设计2. 客户端设计3. 服务端代码实现4. 客户端代码实现5. 实现说明6.实验结果 二、改进常见的服务器高并发方案1. 多线程/多进程模型2. I/O多路复用3. 异步I/O(…...

Kafka Consumer Group

Kafka 消费者组(Consumer Group) 是 Kafka 的核心机制之一!理解它对你掌握 Kafka 的高可用、高吞吐、负载均衡等能力非常关键。下面我来给你完整讲一讲👇 🧠 什么是 Kafka 消费者组(Consumer Group&#x…...

LangChain vs LlamaIndex:大模型应用开发框架深度对比与实战指南

一、引言:大模型时代的应用开发挑战 随着ChatGPT、LLaMA等大语言模型的爆发式发展,如何高效构建「大模型+垂直领域」的智能应用成为新课题。传统开发模式面临三大痛点: 数据交互复杂:大模型与本地数据的融合缺乏标准化接口功能扩展困难:链式调用、工具集成需要重复造轮子…...

第二章:访问远程服务_《凤凰架构:构建可靠的大型分布式系统》

第二章 访问远程服务 2.1 远程服务调用(RPC) 2.1.1 进程间通信机制 核心方式: 管道(Pipe):单向通信,用于父子进程信号(Signal):异步事件通知,不…...

一键自动备份:数据安全的双重保障

随着数字化时代的到来,数据已成为企业和个人不可或缺的核心资产。在享受数据带来的便捷与高效的同时,数据丢失的风险也随之增加。因此,备份文件的重要性不言而喻。本文将深入探讨备份文件的重要性,并介绍两种实用的自动备份方法&a…...

C++11之std::is_convertible

目录 1.简介 2.实现原理 3.使用场景 4.总结 1.简介 std::is_convertible 是 C 标准库 <type_traits> 头文件中的一个类型特性&#xff08;type trait&#xff09;&#xff0c;它用于在编译时检查一个类型是否可以隐式转换为另一个类型。下面的原型&#xff1a; temp…...

从零开始:在Qt中使用OpenGL绘制指南

从零开始&#xff1a;在Qt中使用OpenGL绘制指南 本文只介绍基本的 QOpenGLWidget 和 QOpenGLFunctions 的使用&#xff0c;想要学习 OpenGL 的朋友&#xff0c;建议访问经典 OpenGL 学习网站&#xff1a;LearnOpenGL CN 本篇文章&#xff0c;我们将以绘制一个经典的三角形为例&…...

我的购物车设计思考:从个人项目到生产实战思考的蜕变

一、代码初体验&#xff1a;我踩过的那些坑 还记得大二做课程设计时&#xff0c;我写的购物车直接用ArrayList存商品&#xff0c;结果改数量时遍历半天找商品。现在看你这个HashMap实现&#xff0c;确实清爽很多&#xff0c;但有几点让我想起当年惨痛经历&#xff1a; 1. 线程…...

【算法实践】算法面试常见问题——数组的波浪排序

问题描述 给定一个无序整数数组&#xff0c;将其排列成波浪形数组。若数组 arr[0..n-1] 满足以下条件&#xff0c;则称为波浪形&#xff1a; arr[0] > arr[1] < arr[2] > arr[3] < arr[4] > ... 或 arr[0] < arr[1] > arr[2] < arr[3] > arr[4] &l…...

【大模型深度学习】如何估算大模型需要的显存

一、模型参数量 参数量的单位 参数量指的是模型中所有权重和偏置的数量总和。在大模型中&#xff0c;参数量的单位通常以“百万”&#xff08;M&#xff09;或“亿”&#xff08;B&#xff0c;也常说十亿&#xff09;来表示。 百万&#xff08;M&#xff09;&#xff1a;表示…...

[论文阅读]PMC-LLaMA: Towards Building Open-source Language Models for Medicine

PMC-LLaMA&#xff1a;构建医学开源语言模型 摘要 最近&#xff0c;大语言模型在自然语言理解方面展现了非凡的能力。尽管在日常交流和问答场景下表现很好&#xff0c;但是由于缺乏特定领域的知识&#xff0c;这些模型在需要精确度的领域经常表现不佳&#xff0c;例如医学应用…...

`use_tempaddr` 和 `temp_valid_lft ` 和 `temp_prefered_lft ` 笔记250405

use_tempaddr 和 temp_valid_lft 和 temp_prefered_lft 笔记250405 以下是 Linux 系统中与 IPv6 临时隐私地址相关的三个关键参数 use_tempaddr、temp_valid_lft 和 temp_prefered_lft 的详细说明及协作关系&#xff1a; &#x1f4dc; 参数定义与功能 参数作用默认值依赖关…...