Android Activity开发实操指南:从环境搭建到生命周期调试

发布时间:2026/10/11 21:28:44

Android Activity开发实操指南:从环境搭建到生命周期调试 简介本资源是一份面向软件学院本科生的《移动应用软件开发技术》课程实验报告聚焦Android平台基础开发能力培养适用于移动应用开发入门学习与实践复盘。报告系统覆盖Android开发环境搭建JDK、Eclipse、SDK及ADT插件的安装、配置与验证、Activity生命周期管理与跳转机制、以及UI组件TextView、Button等与布局管理器LinearLayout、RelativeLayout等的实操设计内容紧扣教学大纲具备完整实验目的、原理、步骤与结果要求。资源为1个Word文档.doc大小1.63MB结构清晰含实验截图粘贴指引、环境配置图示说明及详细操作命令便于对照搭建与自查排错。目前已有767人学习下载是掌握Android开发起步阶段核心流程与规范文档撰写的实用参考材料。1. 这不是一份交差用的实验报告它是一份能跑通、能调试、能复现、能进 Gradle 依赖树的 Android 移动应用开发实操手记“软件学院移动应用软件开发技术实验报告”——光看标题你可能以为这是某高校课程作业的 PDF 打印件堆满截图和模板化结论。但真正跑过 Android Studio 4.2、亲手写过onCreate()里setContentView(R.layout.activity_main)、被Activity重建黑屏卡住三小时、在/storage/emulated/0/Android/data/下翻 log 文件找崩溃堆栈的人知道这份报告背后是真实可执行的 UI 构建链路、可验证的生命周期控制逻辑、可复现的Activity跳转与数据传递路径。它不讲“什么是 Activity”而讲“为什么android:configChangesorientation|screenSize加了反而更卡”不列“UI 设计原则”而拆解CoordinatorLayout AppBarLayout CollapsingToolbarLayout在真机上滑动卡顿的帧率瓶颈不抄 Android 官方文档而用adb shell dumpsys activity top看当前栈顶Activity的实际状态。适合正在赶广工大、江南大学、广东工业大学等高校《移动应用软件开发技术》课程实验的本科生也适合刚从 Java Web 转岗、需要快速建立 Android 工程直觉的初级开发者——你不需要懂 Framework 层但必须知道build.gradle里minSdkVersion设错会导致ViewBinding编译失败且这个错误不会报红只会静默生成空 binding 类。2. 从零搭起一个可运行、可调试、可提交的实验工程Android Studio 环境与项目骨架落地2.1 创建兼容性明确、Gradle 可控的最小工程高校实验普遍要求基于 Android 8.0API 26及以上但很多同学直接选 “Empty Activity” 模板结果在真机如华为 EMUI 11、小米 MIUI 13上因targetSdkVersion默认设为 33 而触发后台服务限制导致startService()静默失败。正确做法是反向锁定先查实验指导书要求的最低 API 级别再倒推minSdkVersion和targetSdkVersion。以广工大《移动应用软件开发技术》实验大纲为例明确要求“支持 Android 8.0 及以上”则build.gradle (Module: app)应设android { compileSdk 33 defaultConfig { applicationId com.example.mobilelab minSdkVersion 26 // ← 关键不能设 21 或 16否则部分 Material 组件不可用 targetSdkVersion 33 // ← 必须 ≤ compileSdk且 ≥ minSdk versionCode 1 versionName 1.0 } }提示minSdkVersion 26是硬约束。若设为 21MaterialButton会编译通过但运行时报ClassNotFoundException若设为 33则部分旧设备如三星 Galaxy S7无法安装。targetSdkVersion不建议低于 30否则系统不会强制执行后台位置权限等新行为掩盖真实问题。2.2 启用 ViewBinding 并验证布局绑定有效性实验报告中大量涉及 UI 元素操作如按钮点击更新 TextView传统findViewById()冗长易错。ViewBinding是当前最稳妥的替代方案比 Kotlin Synthetics 更安全比 DataBinding 更轻量。启用方式如下在build.gradle (Module: app)的android { }块内添加buildFeatures { viewBinding true }同步后Android Studio 自动生成ActivityMainBinding类类名 Activity 名 Binding。在MainActivity.kt中替换原setContentView()class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding // ← 声明 binding 实例 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding ActivityMainBinding.inflate(layoutInflater) // ← inflate 而非 setContentView setContentView(binding.root) // ← root 是 ConstraintLayout 根节点 // 此时可直接用 binding.tvResult.text Hello无需 findViewById binding.btnSubmit.setOnClickListener { binding.tvResult.text Submitted! } } }参数说明ActivityMainBinding.inflate()返回完整绑定对象包含所有 XML 中定义的id对应 Viewbinding.root是布局根视图等价于原R.layout.activity_main加载后的 ViewGroup若 XML 中TextView的android:idid/tv_result则 binding 中字段为tvResult下划线转驼峰命名严格区分大小写拼错即编译报错。2.3 配置 Logcat 过滤器与真机 USB 调试白名单实验报告常需截图 Logcat 输出如 Activity 生命周期日志。默认 Logcat 信息杂乱需定制过滤在 Android Studio 右下角 Logcat 面板点击Edit Filter Configuration新建过滤器名称填LabLogPackage Name 填com.example.mobilelab即applicationIdLevel 设为VerboseTag 填MainActivity便于抓生命周期回调关键一步勾选Show only selected application避免系统进程日志干扰。血泪经验未设过滤器时Logcat 每秒刷 50 行系统日志根本找不到onResume()输出。曾有学生交报告时贴出W/ActivityThread: handleWindowVisibility: no activity for token ...这类系统级警告误以为是自己代码问题——其实只是没过滤。3. Activity 生命周期实战不只是背诵 onStart/onResume而是让日志精准反映真实状态流转3.1 在标准 Activity 中注入生命周期日志并验证跳转链路实验报告核心要求之一是“观察 Activity 生命周期变化”。但仅靠Log.d(TAG, onResume)不够——你需要确认日志是否真的对应用户操作而非系统后台调度。以下是在MainActivity.kt中的标准注入方式override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) Log.d(LabLifeCycle, MainActivity: onCreate called) } override fun onStart() { super.onStart() Log.d(LabLifeCycle, MainActivity: onStart called) } override fun onResume() { super.onResume() Log.d(LabLifeCycle, MainActivity: onResume called) } override fun onPause() { super.onPause() Log.d(LabLifeCycle, MainActivity: onPause called) } override fun onStop() { super.onStop() Log.d(LabLifeCycle, MainActivity: onStop called) } override fun onDestroy() { super.onDestroy() Log.d(LabLifeCycle, MainActivity: onDestroy called) }验证步骤务必在真机上操作模拟器无法完全复现运行 AppLogcat 显示onCreate → onStart → onResume按 Home 键显示onPause → onStop从桌面图标重新进入显示onRestart → onStart → onResume按 Back 键退出显示onPause → onStop → onDestroy。注意onRestart()仅在从后台返回时触发onCreate()不会再次调用——这是区分“启动新实例”和“恢复旧实例”的关键证据实验报告中必须体现。3.2 实现带数据传递的 Activity 跳转Intent 与 Bundle 的安全用法实验常要求“从 MainActivity 跳转到 SecondActivity并传递用户名”。错误做法是直接intent.putExtra(name, etName.text.toString())风险在于EditText为空时传null接收端getIntent().getStringExtra(name)返回null导致NullPointerException。安全写法如下// MainActivity.kt 发送端 binding.btnJump.setOnClickListener { val name binding.etName.text.toString().trim() if (name.isNotEmpty()) { val intent Intent(this, SecondActivity::class.java).apply { putExtra(user_name, name) // ← key 用字符串字面量避免拼写错误 } startActivity(intent) } else { Toast.makeText(this, 请输入姓名, Toast.LENGTH_SHORT).show() } }// SecondActivity.kt 接收端 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding ActivitySecondBinding.inflate(layoutInflater) setContentView(binding.root) // 安全取值提供默认值避免 null val userName intent.getStringExtra(user_name) ?: Anonymous binding.tvWelcome.text 欢迎$userName }参数说明putExtra()的 key 必须与接收端getStringExtra()的 key完全一致含大小写建议提取为常量companion object { const val EXTRA_USER_NAME user_name }?: Anonymous是 Kotlin 空安全操作符比if (xxx ! null)更简洁若需传递复杂对象如 User 类必须实现Serializable或Parcelable实验报告中禁止使用Serializable性能差必须用Parcelable——这是高校评分隐性标准。3.3 避免 Activity 重建导致的黑屏与状态丢失配置变更处理的三重保险这是实验报告中最常翻车的点旋转屏幕后 UI 重绘、输入框内容清空、进度条重置。网上搜 “android 避免 activity 重建显示黑屏” 多数方案治标不治本。真正可靠的三重保险如下保险层实施方式适用场景实验报告价值第一重声明配置变更AndroidManifest.xml中为 Activity 添加 android:configChangesorientationscreenSizekeyboardHidden第二重重写 onConfigurationChanged()在 Activity 中覆盖该方法手动调整 View 尺寸/可见性配合第一重避免重建但需手动适配展示对 UI 动态响应能力第三重onSaveInstanceState() onRestoreInstanceState()在onSaveInstanceState()中保存关键数据如 EditText 内容、滚动位置在onCreate()或onRestoreInstanceState()中恢复推荐兼容所有配置变更无需声明configChanges实验报告高分项体现状态持久化思维第三重实操代码必写进报告override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString(input_text, binding.etName.text.toString()) outState.putInt(progress_value, binding.progressBar.progress) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) binding.etName.setText(savedInstanceState.getString(input_text)) binding.progressBar.progress savedInstanceState.getInt(progress_value) }玄学提醒onSaveInstanceState()不保证一定被调用如系统内存不足时会被跳过因此关键业务数据如表单草稿必须同时存入 SharedPreferences 或数据库——实验报告中可加一句“为保障数据可靠性生产环境应结合本地存储”。4. UI 设计落地不止是拖控件而是用 CoordinatorLayout 解决滑动冲突与沉浸式体验4.1 用 CoordinatorLayout AppBarLayout 实现折叠 Toolbar非简单 ConstraintLayout实验报告常要求“实现顶部栏随列表滚动隐藏”。若只用ConstraintLayoutScrollView会出现滑动卡顿、嵌套滚动冲突。正确结构必须是CoordinatorLayout作为根布局!-- activity_main.xml -- androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:androidhttp://schemas.android.com/apk/res/android xmlns:apphttp://schemas.android.com/apk/res-auto android:layout_widthmatch_parent android:layout_heightmatch_parent com.google.android.material.appbar.AppBarLayout android:layout_widthmatch_parent android:layout_heightwrap_content com.google.android.material.appbar.CollapsingToolbarLayout android:layout_widthmatch_parent android:layout_height200dp app:layout_scrollFlagsscroll|exitUntilCollapsed ImageView android:layout_widthmatch_parent android:layout_heightmatch_parent android:scaleTypecenterCrop android:srcdrawable/header_bg app:layout_collapseModeparallax / androidx.appcompat.widget.Toolbar android:layout_widthmatch_parent android:layout_height?attr/actionBarSize app:layout_collapseModepin / /com.google.android.material.appbar.CollapsingToolbarLayout /com.google.android.material.appbar.AppBarLayout androidx.core.widget.NestedScrollView android:layout_widthmatch_parent android:layout_heightmatch_parent app:layout_behaviorstring/appbar_scrolling_view_behavior !-- 此处放你的 TextView、Button 等控件 -- /androidx.core.widget.NestedScrollView /androidx.coordinatorlayout.widget.CoordinatorLayout关键属性说明app:layout_scrollFlagsscroll|exitUntilCollapsed使 Toolbar 在向上滑动时隐藏向下时重新出现app:layout_collapseModeparallax背景图滚动时产生视差效果app:layout_collapseModepinToolbar 固定在顶部不消失app:layout_behaviorstring/appbar_scrolling_view_behavior必须存在否则 NestedScrollView 不响应 AppBarLayout 滚动事件。4.2 实现 Android 进度条ProgressBar的三种形态与交互反馈实验报告常要求“添加加载状态指示器”。android进度条搜索结果多为过时写法如ProgressDialog已废弃。当前标准方案如下类型XML 声明适用场景实验报告备注水平进度条ProgressBar android:layout_widthmatch_parent android:layout_heightwrap_content stylestyle/Widget.MaterialComponents.ProgressBar.Horizontal /文件上传、表单提交进度需配合progress属性或setProgress()动态更新圆形指示器ProgressBar android:layout_width48dp android:layout_height48dp stylestyle/Widget.MaterialComponents.ProgressBar /加载中等待无具体进度设置android:indeterminatetrue为默认值自定义颜色进度条在res/values/colors.xml中定义color nameprogress_accent#FF6F00/color然后app:indicatorColorcolor/progress_accent匹配学校 Logo 色系实验报告中可截图对比默认色与定制色交互控制代码以水平进度条为例// 模拟网络请求开始 binding.progressBar.isIndeterminate false // 关闭不确定模式 binding.progressBar.max 100 binding.progressBar.progress 0 // 启动模拟任务 Thread { for (i in 0..100 step 10) { Thread.sleep(200) runOnUiThread { binding.progressBar.progress i if (i 100) { binding.tvStatus.text 加载完成 } } } }.start()避坑ProgressBar在ViewStub或Gone状态下progress值仍会更新但不可见——实验报告截图必须确保其visibilityvisible。4.3 本地生活平台 UI 设计启示用 Material Design 组件构建可信界面高校实验虽不强调商业设计但“本地生活平台 ui设计”类热词暗示评审潜意识会对比真实 App如美团、大众点评。不必像素级还原但需体现设计语言一致性字体规范正文字体用RobotoAndroid 默认标题用Roboto Medium通过app:fontFamilyfont/roboto_medium加载色彩系统主色primary用学校标准色如广工大蓝#0055A4强调色accent用对比色如橙#FF6F00在res/values/themes.xml中定义组件统一按钮全部用MaterialButton非Button卡片用MaterialCardView确保圆角、阴影、点击涟漪效果一致无障碍支持所有ImageView添加android:contentDescriptionstring/icon_homeTextView添加android:importantForAccessibilityyes。实验报告加分点截图旁标注“采用 Material Design 3 规范符合 WCAG 2.1 AA 标准”哪怕只做了contentDescription——这表明你理解 UI 不仅是视觉更是可访问性。5. 实验报告避坑指南那些让老师皱眉、让助教拒收的致命细节5.1 现象Logcat 截图全是W/Looper: Slow operation或I/Choreographer没有一条LabLifeCycle日志原因Log.d()的 tag 写错如LAB_LIFECYCLE而非LabLifeCycle过滤器匹配失败minSdkVersion设为 21但Log.d()在 API 21 才稳定输出低版本需用Log.v()未在真机上运行模拟器 Logcat 默认关闭Verbose级别。解决统一使用Log.d(LabLifeCycle, ...)过滤器 tag 填LabLifeCycle在onCreate()开头加Log.d(LabLifeCycle, DEBUG: Activity launched)强制验证真机开启开发者选项 → “USB 调试” “USB 调试安全设置”。5.2 现象Activity 跳转后 SecondActivity 黑屏Logcat 报java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: java.lang.NullPointerException原因SecondActivity的onCreate()中setContentView(R.layout.activity_second)被注释或删除activity_second.xml中TextView的android:id与binding.tvWelcome字段名不匹配如写成id/tv_welcomebinding 生成为tvWelcome但代码中误写binding.tv_welcomeSecondActivity未在AndroidManifest.xml中声明activity android:name.SecondActivity /。解决检查SecondActivity.kt是否有setContentView()清理项目Build → Clean Project重新生成 binding 类在 Manifest 中确认 activity 声明且android:name以.开头表示同包。5.3 现象ProgressBar 不动或进度跳变0→50→100无平滑过渡原因在子线程中直接调用binding.progressBar.progress i未切回主线程max值未设置默认为 10000progress100实际只走 1%使用postInvalidate()强刷 UI但 ProgressBar 不响应。解决所有 UI 更新必须在runOnUiThread { }或Handler(Looper.getMainLooper()).post { }中执行显式设置binding.progressBar.max 100避免在循环中高频更新如每 10ms改为Thread.sleep(200)控制节奏。5.4 现象真机安装后闪退Logcat 显示Caused by: java.lang.ClassNotFoundException: Didnt find class androidx.appcompat.widget.Toolbar原因build.gradle中未添加implementation androidx.appcompat:appcompat:1.6.1minSdkVersion设为 26但appcompat版本过低如 1.0.0不兼容AndroidManifest.xml中application标签缺少android:themestyle/Theme.MaterialComponents.DayNight.DarkActionBar。解决确保appcompat版本 ≥1.4.0适配 API 26主题必须继承Theme.MaterialComponents系列禁用Theme.AppCompat已过时同步 Gradle 后重启 Android Studio。5.5 现象实验报告截图中 UI 元素错位、文字重叠ConstraintLayout 约束未生效原因app:layout_constraintTop_toTopOfparent写成app:layout_constraintTop_toBottomOfparentTextView的android:layout_widthwrap_content但父容器未设android:layout_width0dp即未启用 Chain 或 Guideline使用tools:textPreview仅预览运行时无数据导致空白。解决在 Layout Editor 中右键 View → “Center Horizontally in Parent” 自动生成约束宽度为0dp时必须配对app:layout_constraintLeft_toLeftOfparent和app:layout_constraintRight_toRightOfparent运行时用binding.tvTitle.text 实验标题替代tools:text。6. 让实验报告真正“活”起来用 adb 命令验证 Activity 栈与文件存储路径6.1 用 adb shell dumpsys activity 命令查看实时 Activity 栈状态截图Logcat是静态证据而dumpsys是动态权威。实验报告若附上此命令输出可信度飙升。操作流程手机连接电脑开启 USB 调试终端执行adb devices # 确认设备在线 adb shell dumpsys activity activities | grep mResumedActivity\|mFocusedActivity输出示例mResumedActivity: ActivityRecord{a1b2c3d com.example.mobilelab/.MainActivity t21} mFocusedActivity: ActivityRecord{a1b2c3d com.example.mobilelab/.MainActivity t21}解读t21是 task id/.MainActivity表明当前栈顶是 MainActivity若跳转到 SecondActivity此处会变为/.SecondActivity。实验报告中可截图此命令输出并标注“证实 Activity 切换成功无异常销毁”。技巧dumpsys activity top更精简只显示栈顶 Activitydumpsys activity recents查看最近任务列表——这些命令比 Logcat 更底层老师一眼看出你真机实操过。6.2 验证应用私有目录与外部存储路径定位/storage/emulated/0/Android/data/com.example.mobilelab/实验常要求“将日志写入外部存储”。但android/data/com.tencent.tmgp.sgame/files/pandora/pr这类路径是其他 App 的你的包名是com.example.mobilelab。必须用getExternalFilesDir()获取合法路径val logFile File(getExternalFilesDir(null), lab_log.txt) logFile.writeText(Activity created at ${System.currentTimeMillis()}\n, append true) Log.d(LabFileIO, Log saved to ${logFile.absolutePath})验证路径是否正确adb shell ls -l /storage/emulated/0/Android/data/com.example.mobilelab/files/ # 应输出 lab_log.txt关键区别getExternalFilesDir(null)→/storage/emulated/0/Android/data/com.example.mobilelab/files/无需权限卸载即删Environment.getExternalStorageDirectory()→/storage/emulated/0/需WRITE_EXTERNAL_STORAGE权限Android 10 被限制getFilesDir()→/data/data/com.example.mobilelab/files/私有目录adb pull 可取但用户不可见。实验报告建议在“数据存储”章节附上adb shell ls截图并标注“路径符合 Android 存储分区规范避免使用已废弃的 Environment.getExternalStoragePublicDirectory()”。6.3 用 adb backup 提取 APK 与数据生成可复现的交付物一份合格的实验报告最终交付物不应只是 PDF而应是可一键安装、可验证功能的 APK 源码压缩包。adb backup可导出应用数据含 SharedPreferences但更实用的是生成签名 APKBuild → Generate Signed Bundle/APK → APK → Next选择key.jks无则新建填密码Key alias填labkeyKey store password与Key password一致设为lab123实验用勿用于生产Build Type选release勾选V1 (Jar Signature)和V2 (Full APK Signature)完成后APK 路径为app/release/app-release.apk。交付检查清单写进报告附录✅app-release.apk可在真机安装并运行✅app/src/main/java/下所有 Activity 类命名规范MainActivity.kt,SecondActivity.kt✅app/src/main/res/layout/下 XML 文件名小写下划线activity_main.xml✅build.gradle中minSdkVersion、targetSdkVersion、compileSdk三者关系正确✅AndroidManifest.xml中 activity 声明完整无拼写错误。我带过三届广工大移动开发实验课最常看到学生花 3 天调通Activity跳转却在最后一天发现minSdkVersion设错导致 APK 无法安装——所以现在我的习惯是每次git commit前先adb install app-debug.apk验证安装再adb shell dumpsys activity top确认栈状态最后adb shell ls /data/data/com.example.mobilelab/shared_prefs/检查数据存取。这三步耗时不到 30 秒却能避开 80% 的返工。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/11 21:23:44

大麦网抢票自动化:HTTP协议层逆向与风控对抗实战

简介:本资源是一份面向Python初学者与自动化开发实践者的轻量级抢票工具脚本,聚焦大麦网高并发购票场景下的核心流程自动化实现。资源包仅含1个Python源文件(damai.py),体积精简至2KB,完整封装了登录验证、…

2026/10/11 21:23:44

基于Spark的信用卡评分卡全流程实战:从特征工程到模型落地

简介:这是一份面向大数据与数据分析学习者的完整课程设计资源,主题是基于Spark的信用卡评分数据分析。项目以和鲸社区的信用卡评分模型构建数据为数据集,使用Python调用Spark完成数据预处理、特征分析与可视化,最终形成多张HTML图…

2026/10/11 21:23:44

用vnpy构建选股+回测+机器学习一体化量化交易系统

简介:本资源是一套基于vnpy框架深度二次开发的量化投资实践项目,面向金融工程开发者、量化交易爱好者及AI金融交叉领域学习者,聚焦选股策略构建、多因子回测验证与机器学习模型集成三大核心问题。压缩包共1656个文件,涵盖299个Pyt…

2026/10/12 1:04:26

达梦数据库纯命令行初始化:dminit与disql全流程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:04:26

PMTA 5.0邮件群发系统核心机制与源码对接实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:04:26

爱立信天线权值参数详解:公共信道赋形四个参数与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:04:26

BeagleY-AI边缘AI实战:Python驱动视觉识别与舵机控制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:04:26

5G测试规范实战指南:从拓扑选型到避坑排错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:59:25

Cursor规则配置实战:从默认到顺手,少改一半代码

说实话,我第一次用Cursor的时候,内心是有点失落的。网上到处都说它多智能、多能提效,结果我装好后,Tab补全倒是挺快,可生成的东西跟我手写习惯差得太远,Agent改代码也经常南辕北辙。直到我把一套规则写进配…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/12 0:04:22

绝缘子缺陷检测数据集清洗与工业级训练实战指南

简介:本资源是面向电力AI研发人员、工业视觉工程师及智能巡检系统开发者的绝缘子缺陷检测专用YOLO格式数据集,解决无人机航拍场景下绝缘子破损、污闪、积雪等9类典型缺陷的精准识别与定位难题。数据集共2139张真实巡检图像(含训练/验证/测试集…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑