IntentUri页面跳转
android browser支持支持Intent Scheme URL语法的可以在wrap页面加载或点击时,通过特定的intent uri链接可以打开对应app页面,例如
<a href="intent://whatsapp/#Intent;scheme=myapp;package=com.xiaoyu.myapp;S.help_url=http://Fzxing.org;end">what can I do</a>
通过android系统解析查找符合规则的Activity后启动对应activity,如果未找到匹配Activity则browser进行处理。
配置
1 2 3 4 5 6 7 8 | <a href= "intent://whatsapp/#Intent;scheme=myapp;package=com.xiaoyu.myapp;S.help_url=http://Fzxing.org;end" >what can I do </a> //这样如果没有对应应用,该链接就会跳转到S.help_url指定的url上 <intent-filter> <action android:name= "android.intent.action.VIEW" /> <category android:name= "android.intent.category.DEFAULT" /> <category android:name= "android.intent.category.BROWSABLE" /><!-- 定义浏览器类型,有URL需要处理时会过滤 --> <data android:scheme= "myapp" android:host= "whatsapp" android:path= "/" /><!-- 打开以whatsapp协议的URL,这个自己定义 --> </intent-filter> |
URI的解析与生成:
在Intent 类内部有个parseUri(String uri, int flags)方法用来解析Uri生成Intent返回,下面主要分析该方法:
在分析该解析方法时候,首先我们需要理解intent uri规则,在intent类里规则串如下,
1 | android-app: //com.example.app/<br />#Intent;action=com.example.MY_ACTION;<br />i.some_int=100;S.some_str=hello;end |
根据此规则,看出主要分为三个部分:
Header: android-app://android app为判断是否是android 应用
Action: com.example.MY_ACTION //组件的action内容
Package: com.example.app //包名启动组件使用
Extra: some_int=(int)100,some_str=(String)hello //传递的数据,i代表int,S代表String ,c代表char等基本类型
除了这几部分内容也包含intent内的其它内容,如categry,type,component,selector等
在简单分析理解Uri规则串后,再来分析parseUri就很好理解了,下面看一下主要代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | public static Intent parseUri(String uri, int flags) throws URISyntaxException { int i = 0 ; try { final boolean androidApp = uri.startsWith( "android-app:" ); //判断开头是否为android, // Validate intent scheme if requested. if ((flags&(URI_INTENT_SCHEME|URI_ANDROID_APP_SCHEME)) != 0 ) { if (!uri.startsWith( "intent:" ) && !androidApp) { //是否为intent Uri Intent intent = new Intent(ACTION_VIEW); try { intent.setData(Uri.parse(uri)); } catch (IllegalArgumentException e) { throw new URISyntaxException(uri, e.getMessage()); } return intent; } } i = uri.lastIndexOf( "#" ); //查找标记位,开始解析 // simple case if (i == - 1 ) { if (!androidApp) { return new Intent(ACTION_VIEW, Uri.parse(uri)); } // old format Intent URI } else if (!uri.startsWith( "#Intent;" , i)) { if (!androidApp) { return getIntentOld(uri, flags); } else { i = - 1 ; } } // new format Intent intent = new Intent(ACTION_VIEW); Intent baseIntent = intent; boolean explicitAction = false ; boolean inSelector = false ; // fetch data part, if present String scheme = null ; String data; if (i >= 0 ) { data = uri.substring( 0 , i); i += 8 ; // length of "#Intent;" } else { data = uri; } // loop over contents of Intent, all name=value; while (i >= 0 && !uri.startsWith( "end" , i)) { //按类别分离循环处理(解析action,categry,type,extra data) int eq = uri.indexOf( '=' , i); if (eq < 0 ) eq = i- 1 ; int semi = uri.indexOf( ';' , i); String value = eq < semi ? Uri.decode(uri.substring(eq + 1 , semi)) : "" ; // action if (uri.startsWith( "action=" , i)) { intent.setAction(value); if (!inSelector) { explicitAction = true ; } } // categories else if (uri.startsWith( "category=" , i)) { intent.addCategory(value); } // type else if (uri.startsWith( "type=" , i)) { intent.mType = value; } // launch flags else if (uri.startsWith( "launchFlags=" , i)) { intent.mFlags = Integer.decode(value).intValue(); if ((flags& URI_ALLOW_UNSAFE) == 0 ) { intent.mFlags &= ~IMMUTABLE_FLAGS; } } // package else if (uri.startsWith( "package=" , i)) { intent.mPackage = value; } // component else if (uri.startsWith( "component=" , i)) { intent.mComponent = ComponentName.unflattenFromString(value); } // scheme else if (uri.startsWith( "scheme=" , i)) { if (inSelector) { intent.mData = Uri.parse(value + ":" ); } else { scheme = value; } } // source bounds else if (uri.startsWith( "sourceBounds=" , i)) { intent.mSourceBounds = Rect.unflattenFromString(value); } // selector else if (semi == (i+ 3 ) && uri.startsWith( "SEL" , i)) { intent = new Intent(); inSelector = true ; } // extra data parse else { String key = Uri.decode(uri.substring(i + 2 , eq)); // create Bundle if it doesn't already exist if (intent.mExtras == null ) intent.mExtras = new Bundle(); Bundle b = intent.mExtras; // add EXTRA,这里巧妙的对基本数据类型进行处理,(字母.var)值得学习借鉴 if (uri.startsWith( "S." , i)) b.putString(key, value); else if (uri.startsWith( "B." , i)) b.putBoolean(key, Boolean.parseBoolean(value)); else if (uri.startsWith( "b." , i)) b.putByte(key, Byte.parseByte(value)); else if (uri.startsWith( "c." , i)) b.putChar(key, value.charAt( 0 )); else if (uri.startsWith( "d." , i)) b.putDouble(key, Double.parseDouble(value)); else if (uri.startsWith( "f." , i)) b.putFloat(key, Float.parseFloat(value)); else if (uri.startsWith( "i." , i)) b.putInt(key, Integer.parseInt(value)); else if (uri.startsWith( "l." , i)) b.putLong(key, Long.parseLong(value)); else if (uri.startsWith( "s." , i)) b.putShort(key, Short.parseShort(value)); else throw new URISyntaxException(uri, "unknown EXTRA type" , i); } // move to the next item i = semi + 1 ; } if (inSelector) { // The Intent had a selector; fix it up. if (baseIntent.mPackage == null ) { baseIntent.setSelector(intent); } intent = baseIntent; } ...... return intent; //解析生产内容,对应到生产的intent,返回处理 } catch (IndexOutOfBoundsException e) { throw new URISyntaxException(uri, "illegal Intent URI format" , i); } } |
经过上面简要分析,我们了解Uri intent生成过程,这种设计非常巧妙可以达到很好的解耦处理,相比于显示与隐士启动方式,这种方式更加灵活。
例如,我们可以由Server端动态下发,本地通过解析后在进行跳转页面,即可达到动态控制页面功能,其实不仅可以应用到页面跳转中,如果进一步扩展,可以应用到更多功能中,
比如我们可以扩展自定义规则,如header改为:http,https,代表页面跳转到webActivity,header改为:tipe时为toast提示,改为dialog时为弹框显示等。
我们还可以更为细致的控制,如可加入版本号指定对应的版本的app执行这规则,其余版本默认行为,适用于修复部分bug。由此可见我们可以通过修改parseUri方法即可以扩展到更多功能中,下面看一下我的修改,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | static final String TAG= "PageJump" ; static final String SCHEME_INTENT = "page" ; static final String SCHEME_ANDROIDAPP = "android-app:" ; static final String SCHEME_HTTP = "http" ; static final String SCHEME_HTTPS = "https" ; static final String SCHEME_TIPS_DIALOG = "tips_dialog" ; static final String SCHEME_TIPS_TOAST = "tips_toast" ; //动态解析实现对页面行为控制 public static void jumpPageUri(Context context, String strUri) throws URISyntaxException{ //{(2,5][8,12)}android-app://com.example.app/<br />#Intent;action=com.example.MY_ACTION; if (TextUtils.isEmpty(strUri)) { throw new NullPointerException( "parser uri content is empty" ); } String data = strUri.trim(); //uri是否在版本内 final int curVer = Utils.getVerCode(context); if (isInRangeVersion(data,curVer)){ return ; } //remove command version part if (data.startsWith( "{" )) { int verEnd = data.indexOf( '}' , 1 ); data = data.substring(verEnd+ 1 ); } String uriData = data; if (uriData.startsWith(SCHEME_ANDROIDAPP)){ Intent intent = Intent.parseUri(uriData, Intent.URI_INTENT_SCHEME); String appPackage = context.getPackageName(); ComponentName componentName = intent.getComponent(); //out intent if (componentName == null || !appPackage.contains(componentName.getPackageName())){ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } else if (uriData.startsWith(SCHEME_INTENT)) { Intent sendIntent = UriProcessor.parseIntentUri(data, Intent.URI_INTENT_SCHEME); // Verify that the intent will resolve to an activity // if (null == sendIntent.resolveActivity(context.getPackageManager())) { // throw new URISyntaxException(data, "not found match page"); // } sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(sendIntent); } else if (uriData.startsWith(SCHEME_HTTP) || uriData.startsWith(SCHEME_HTTPS)) { // WebViewActivity.launch(context, uri); } else if (uriData.startsWith(SCHEME_TIPS_DIALOG)){ // DialogUtil.showNormal("test"); } else if (uriData.startsWith(SCHEME_TIPS_TOAST)){ // ToastUtils.showShortMessage(""); } } |
规则串前面增加了应用版本范围,{(2,5][8,12)},这里我使用开闭区间的方式来指定及范围,这种方式更精简使用,版本解析处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | /** * current command version whether contain current app version * @param data * @param curVer * @return */ public static boolean isInRangeVersion(String data, final int curVer){ if (data.startsWith( "{" )){ int verEnd = data.indexOf( '}' , 1 ); if (verEnd> 0 ) { String verStr = data.substring( 0 , verEnd+ 1 ); boolean in_range= true ; int pos= 1 ; try { while (pos >= 0 && !verStr.startsWith( "}" )) { in_range= true ; char ch = verStr.charAt(pos); if (ch == '[' || ch == '(' ) { boolean [] border= new boolean [ 2 ]; int semi = verStr.indexOf( ',' , pos); int startVer = Integer.valueOf(verStr.substring(pos + 1 , semi)); border[ 0 ]= (ch== '[' ); int toVer = 0 , flagVer = 0 ; if ((flagVer = verStr.indexOf( ']' , semi)) >= 0 || (flagVer = verStr.indexOf( ')' , semi)) >= 0 ) { toVer = Integer.valueOf(verStr.substring(semi + 1 , flagVer)); border[ 1 ]= (verStr.charAt(flagVer)== ']' ); } // judge current version code not inside range // jude min version code < <= if ((border[ 0 ] && curVer<startVer) ||(!border[ 0 ] && curVer<=startVer)){ in_range= false ; } // judge max version code > >= if ((border[ 1 ] && curVer>toVer) ||(!border[ 1 ] && curVer>=toVer)){ in_range= false ; } pos = flagVer + 1 ; if (pos + 1 >= verStr.length()) break ; } } return in_range; } catch (NumberFormatException ex){ Log.e(TAG, "parse regular expression version error!" ); } } return true ; } return true ; } |
测试使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // String jumpUri1="{(2,5][8,12)}android-app://com.example.app/#Intent;action=com.example.MY_ACTION;i.some_int=100;S.some_str=hello;end"; String jumpUri2= "{(0,3][6,12)}android-app://com.example.app/#Intent;action=com.example.MY_ACTION;i.some_int=100;end" ; String jumpUri3= "{(0,6]}android-app://com.example.app/#Intent;action=com.example.MY_ACTION;i.some_int=100;end" ; String jumpUriPage= "{(2,6]}android-app://com.example.myapp/#Intent;action=com.example.myapp.SecondActivity;package=com.example.myapp;category=android.intent.category.DEFAULT;S.some=systemFrom;end" ; String jumpUriPage2= "{[1,8]}page#Intent;action=com.example.myaction;package=com.example.myapp;category=android.intent.category.DEFAULT;S.some=innerFrom;end" ; try { // PageJump.jumpPageUri(getApplicationContext(),jumpUri1); PageJump.jumpPageUri(getApplicationContext(),jumpUri2); PageJump.jumpPageUri(getApplicationContext(),jumpUri3); } catch (URISyntaxException e) { e.printStackTrace(); } |
分析intent的代码设计后,真是觉得源码设计的十分巧妙,值得仔细认真琢磨。
参考:关于Intent Uri页面跳转 - HappyCode002 - 博客园
https://zhuanlan.zhihu.com/p/449084824
https://www.51cto.com/article/554845.html
相关文章:
IntentUri页面跳转
android browser支持支持Intent Scheme URL语法的可以在wrap页面加载或点击时,通过特定的intent uri链接可以打开对应app页面,例如 <a href"intent://whatsapp/#Intent;schememyapp;packagecom.xiaoyu.myapp;S.help_urlhttp://Fzxing.org;end&qu…...
蓝桥杯2114 李白打酒加强版
问题描述 话说大诗人李白, 一生好饮。幸好他从不开车。 一天, 他提着酒显, 从家里出来, 酒显中有酒 2 斗。他边走边唱: 无事街上走,提显去打酒。 逢店加一倍, 遇花喝一斗。 这一路上, 他一共遇到店 N 次, 遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了。…...
[ 计算机网络 ] 深入理解OSI七层模型
🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…...
实战:基于Pangolin Scrape API,如何高效稳定采集亚马逊BSR数据并破解反爬虫?
引言:BSR数据——亚马逊运营的"指南针" 在竞争激烈的亚马逊市场,BSR (Best Sellers Rank) 数据已经成为卖家们不可或缺的"指南针"。这一数字化指标不仅反映商品在特定品类中的销售表现,更直接影响平台的流量分配和消费者…...
电子制造企业智能制造升级:MES系统应用深度解析
在全球电子信息产业深度变革的2025年,我国电子信息制造业正经历着增长与转型的双重考验。据权威数据显示,2025年一季度行业增加值同比增长11.5%,但智能手机等消费电子产量同比下降1.1%,市场竞争白热化趋势显著。叠加关税政策调整、…...
lambda架构和kappa架构区别
Lambda架构与Kappa架构是大数据处理领域的两种核心架构模式,主要差异体现在数据处理逻辑、系统复杂度和适用场景等方面。以下是二者的详细对比分析: 一、核心设计差异 Lambda架构 包含三层:批处理层(Batch Layer)、…...
【css知识】flex-grow: 1
目录 一、基本概念:二、工作原理:多个元素的情况: 三、实际应用示例:常见使用场景:注意事项: 四、最佳实践:五、与其他 flex 属性配合: 🚀写在最后 flex-grow: 1是什么&a…...
六足连杆爬行机器人的simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统原理简介 5.完整工程文件 1.课题概述 六足连杆爬行机器人的simulink建模与仿真。通过simulink,对六足机器人的六足以及机身进行simulink建模,模拟其行走,仿真输出机器人行走时六足的坐…...
软考软件测评师——系统安全设计(防火墙技术)
目录 一、核心概念解析 二、技术联动体系 三、技术局限认知 四、网络架构设计 五、防护系统测试规范 一、核心概念解析 1. 防火墙技术 网络安全基础防护体系,通过软硬件结合方式在内外部网络间建立隔离屏障。核心作用包括流量监控、访问控制、日志记录三大模块…...
漏洞检测与渗透检验在功能及范围上究竟有何显著差异?
漏洞检测与渗透检验是确保系统安全的重要途径,这两种方法各具特色和功效,它们在功能上有着显著的差异。 目的不同 漏洞扫描的主要任务是揭示系统内已知的安全漏洞和隐患,这就像是对系统进行一次全面的健康检查,看是否有已知的疾…...
探秘「4+3原型驱动的交付模式」如何实现软件快速定制
软件行业长期受困于需求沟通难题:客户需求表达不清、频繁变更及真伪需求混杂难辨;终端业务部门参与度低加剧后期确认困难,加之调研结果传递失真引发功能实现偏差——"需求黑洞"始终是甲乙双方的共同痛点。 然而,NC科技…...
C语言入门
一、认识C语言 什么是C语言 C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,…...
java 异常验证框架validation,全局异常处理,请求验证
1、依赖 异常验证框架validation<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>${spring-boot.version}</version></dependency> 当鼠标放在依…...
如何使用VH6501进行CAN采样点测试
Vector 的 VH6501 是一种专为 CAN 和 CAN FD 网络设计的干扰测试设备,集成了干扰生成和 CANoe 网络接口功能,支持通过 CAPL 脚本实现测试自动化。 硬件规格如下: VH6501采样点测试原理是:干扰一帧报文中某一位的采样点附近的总线电…...
QT6 源(113)篇二:阅读与注释工具栏 QToolBar,给出源码
(9)本源码来自于头文件 qtoolbar . h : #ifndef QDYNAMICTOOLBAR_H #define QDYNAMICTOOLBAR_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtGui/qaction.h> #include <QtWidgets/qwidget.h>QT_REQUIRE_CONFIG(to…...
编程日志5.13
邻接表的基础代码 #include<iostream> using namespace std; //邻接表的类声明 class Graph {private: //结构体EdgeNode表示图中的边结点,包含顶点vertex、权重weight和指向下一个边结点的指针next struct EdgeNode { int vertex; int weight; …...
Java 08集合
集合 Collection 接口,不可以创建对象add clear remove contains(Object obj);判断是否存在 isEmpty 空返回为true sizeArrayList Collection<String> cnew ArraryList<>(); 以多态的方法创建集合对象,调用单列集合中的共有方法 编译看…...
CSS 背景全解析:从基础属性到视觉魔法
CSS 背景属性用于定义HTML元素的背景。 CSS 属性定义背景效果: background-color background-image background-repeat background-attachment background-position 一、background-color:背景颜色 作用:设置元素的背景色,支持所有合法…...
2025华为OD机试真题+全流程解析+备考攻略+经验分享+Java/python/JavaScript/C++/C/GO六种语言最佳实现
华为OD全流程解析,备考攻略 快捷目录 华为OD全流程解析,备考攻略一、什么是华为OD?二、什么是华为OD机试?三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…...
中小型制造业信息化战略规划指南
1 引言 在当今技术飞速发展和全球竞争日趋激烈的时代,信息化建设对于中小型制造企业(SME)而言,已不再是可有可无的选项,而是关乎生存、发展和保持持续竞争力的核心要素。在数字化浪潮席卷全球的背景下,制造…...
PowerBI 矩阵实现动态行内容(如前后销售数据)统计数据,以及过滤同时为0的数据
我们有一张活动表 和 一张销售表 我们想实现如下的效果,当选择某个活动时,显示活动前后3天的销售对比图,如下: 实现方法: 1.新建一个表,用于显示列: 2.新建一个度量值,用SELECTEDVA…...
在QT中栅格布局里套非栅格布局的布局会出现父布局缩放子布局不跟随的问题
这个是 Qt Designer 设计界面中的一个“常见陷阱”。 🧠 结论先说: 在 Qt Designer 中使用栅格布局(Grid Layout)嵌套其他栅格布局,一般不会出问题,但如果嵌套的是水平布局(HBox)或垂…...
Pydantic数据验证实战指南:让Python应用更健壮与智能
导读:在日益复杂的数据驱动开发环境中,如何高效、安全地处理和验证数据成为每位Python开发者面临的关键挑战。本文全面解析了Pydantic这一革命性数据验证库,展示了它如何通过声明式API和类型提示系统,彻底改变Python数据处理模式。…...
深度解析 HDFS与Hive的关系
1. HDFS 和 Hive 如何协同 我们将从 HDFS(Hadoop Distributed File System) 的架构入手,深入剖析其核心组成、工作机制、内部流程与高可用机制。然后详细阐述 Hive 与 HDFS 的关系,从执行流程、元数据管理、文件读写、计算耦合等…...
ArrayList源码分析
1. ArrayList默认初始化容量 首先编写一个简单的初始化ArrayList的代码 List<String> li new ArrayList<>();然后进入ArrayList中,在无参数构造方法中可以查看到上面的绿色注释中写了构造一个空的集合并且初始化容量为10。接下来继续查看源码&#x…...
文件操作和IO-2 使用Java操作文件
Java操作文件的API 1、针对文件系统的操作。包括但不限于:创建文件、删除文件、重命名文件、列出目录内容…… 2、针对文件内容的操作。读文件/写文件 Java中针对文件的操作,使用File类来进行操作,这个类被存储在java.io这个包里面。 i&a…...
day 31
文件的拆分 1. 项目核心代码组织 src/(source的缩写):存放项目的核心源代码。 2. 配置文件管理 config/ 目录:集中存放项目的配置文件,方便管理和切换不同环境(开发、测试、生产)的配置。 …...
基于Python批量删除文件和批量增加文件
一、为什么写这么一个程序 其实原因也是很简单的,我去网上下载了一个文件夹,里面太多别人的文件了,我不喜欢,所以我就写了这么一个代码。 二、安装Python和vscode 先安装Python在安装vscode Python安装 vscode的安装 三、源码…...
【信息系统项目管理师】第12章:项目质量管理 - 26个经典题目及详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
ShenNiusModularity项目源码学习(27:ShenNius.Admin.Mvc项目分析-12)
订单列表页面用于浏览、检索、维护商城模块的订单信息。订单列表页面的后台控制器类OrderController位于ShenNius.Admin.Mvc项目的Areas\Shop\Controllers内,页面文件位于同项目的Areas\Shop\Views\Order内,其中Index.cshtml页面为主页面,Det…...
(T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复
一、不小心删除 今天是2025年5月15日,非常沉重的一天,就在今早8点左右的时候我打算继续做我的毕业设计,由于开机的过程十分缓慢(之前没有),加上刚开机电脑有卡死的迹象,再加上昨天晚上关电脑前…...
【Python装饰器深度解析】从语法糖到元编程实战
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…...
操作系统学习笔记第5章 (竟成)
目录 第 5 章 输入 / 输出 (I/O) 管理 5.1 I/O 管理基础 5.1.1 I/O 设备 1.I/O 设备的基本概念 2.I/O 设备的分类 3.I/O 接口 4.I/O 端口 (1) I/O 端口的概念 (2) I/O 端口的编址 ① 独立编址方式 ② 统一编址方式 5.1.2 I/O 控制方式 1. 程序查询方式 2. 程序中断方式 3. DMA …...
【DCGMI专题1】---DCGMI 在 Ubuntu 22.04 上的深度安装指南与原理分析(含架构图解)
目录 一、DCGMI 概述与应用场景 二、Ubuntu 22.04 系统准备 2.1 系统要求 2.2 环境清理(可选) 三、DCGMI 安装步骤(详细图解) 3.1 安装流程总览 3.2 分步操作指南 3.2.1 系统更新与依赖安装 3.2.2 添加 NVIDIA 官方仓库 3.2.3 安装数据中心驱动与 DCGM 3.2.4 服务…...
C# 使用 OpenCV 基础
一、C#安装OpenCV 安装上面两个模块 二、使用 导入 using OpenCvSharp;加载图片 // 导入图片 Mat image Cv2.ImRead("C:\x5.bmp"); // 拷贝 Mat image2 image.Clone();// 打开窗口 Cv2.NamedWindow("image", WindowFlags.AutoSize); // 显示图片 Cv2…...
如何解决全局或静态变量被修改的bug
问题卡死 程序原来设置Firware name 时N32G475,在程序运行时,程序崩溃,发现输出的固件名称没有了,这里说明固件名称被程序修改了 程序在开机时都是对的 打开map文件查找fw_name的内存地址,他的值被更改,就…...
[Java实战]Spring Boot整合Sentinel:流量控制与熔断降级实战(二十九)
[Java实战]Spring Boot整合Sentinel:流量控制与熔断降级实战(二十九) 一、Sentinel简介 Sentinel是阿里开源的分布式系统流量防卫组件,核心功能包括: 流量控制:根据QPS、线程数等指标限制资源访问熔断降…...
Linux系统中,Ctrl+C的运行过程是什么?
文章目录 前言1.终端驱动捕获键盘输入2.信号发送到前台进程组3. 进程处理信号4. 信号传递的详细流程5. Shell 的后续处理关键机制说明扩展:其他相关信号总结 前言 今天看到有个小伙伴面试问到这个问题,感觉挺有意思,我们后端开发者相信都用过…...
101个α因子#9
((0 < ts_min(delta(close, 1), 5)) ? delta(close, 1) : ((ts_max(delta(close, 1), 5) < 0) ? delta(close, 1) : (-1 * delta(close, 1))))worldquant brain平台上调整后的语法: ((0 < min(close-ts_delay(close, 1), ts_delay(close, 1)-ts_delay(c…...
DAY28 超大力王爱学Python
知识点回顾: 类的定义pass占位语句类的初始化方法类的普通方法类的继承:属性的继承、方法的继承 作业 题目1:定义圆(Circle)类 import mathclass Circle:def __init__(self, radius1):self.radius radius # 半径属性…...
【C++算法】70.队列+宽搜_N 叉树的层序遍历
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 429. N 叉树的层序遍历 题目描述: 解法 使用队列层序遍历就可以了。 先入根节点1。queue:1 然后出根节点1,入孩子节点2,3&a…...
常用UI自动化测试框架
🔍 常用UI自动化测试框架全览(Web / 移动 / 桌面 / AI驱动) UI(用户界面)测试框架是一类用于自动化测试应用图形界面的工具,帮助开发者和测试人员验证界面元素的功能性、交互性和视觉一致性。本文系统梳理了…...
C语言指针深入详解(五):回调函数、qsort函数
目录 一、回调函数 1、使用回调函数改造前 2、使用回到函数改造后 二、qsort使用举例 1、使用qsort函数排序整型数据 2、使用qsort排序结构数据 三、qsort函数模拟实现 结语 🔥个人主页:艾莉丝努力练剑 🍓专栏传送门:《…...
# YOLOv5:目标检测的新里程碑
YOLOv5:目标检测的新里程碑 在计算机视觉领域,目标检测一直是研究的热点和难点之一。近年来,随着深度学习技术的飞速发展,目标检测算法也取得了显著的进步。YOLO(You Only Look Once)系列算法以其高效的实…...
beanstalk一直被重新保留(reserved 状态)消息删除
说明:wallet是我的tube 完整流程示例 暂停 tube(防止任务被重新保留)pause-tube wallet 300踢回并删除任务kick 100000 # 踢回所有 reserved 任务 delete 183723 # 删除目标任务恢复 tube(取消暂停)pause-tu…...
NLP学习路线图(二): 概率论与统计学(贝叶斯定理、概率分布等)
引言 自然语言处理(NLP)作为人工智能的重要分支,致力于让机器理解、生成和操作人类语言。无论是机器翻译、情感分析还是聊天机器人,其底层逻辑都离不开数学工具的支持。概率论与统计学是NLP的核心数学基础之一,它们为…...
塔能智能照明方案——贵州某地区市政照明改造实践
在城市市政建设中,照明系统作为城市基础设施的重要组成部分,其能耗问题日益凸显。传统市政照明设备能耗高、运维效率低,成为城市绿色发展的阻碍。塔能科技针对这一痛点,为贵州某地区量身打造智能照明改造方案,通过技术…...
Mybatis的逆向工程Generator
Mybatis的逆向工程 什么是逆向工程 generator 简单点说,就是通过数据库中的单表,自动生成java代码。 Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类) 企业开发中&#…...
Runtime Suspend 专项训练
Q1. 什么是 Runtime PM?与 System Suspend 有什么区别? 答: Runtime PM(运行时电源管理)是 Linux 内核为单个设备提供的自动挂起机制。其核心思想是在设备空闲期间,关闭其时钟、电源、总线连接等资源&…...
香港科技大学(广州)智能制造理学硕士招生宣讲会——深圳大学专场
深圳大学专场宣讲会 时间:5月22日(星期四)19:00-20:00 地点:深圳大学沧海校区致原楼1101 🎓主讲嘉宾: 汤凯 教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-personal-page/TANG-Kai/mektang …...