简介:这是一份面向安卓初学者的智慧医疗主题期末大作业实践资源,聚焦疫苗预约核心功能,完整覆盖App开发全流程,助力学生快速掌握Android Studio开发、UI布局设计、数据交互与APK打包等关键技能。资源包共121个文件,含21个Java业务逻辑文件、41个XML界面与配置文件、30张JPG运行截图及16张PNG图标资源,辅以Gradle构建脚本、设计报告(.docx)、可直接运行的APK与exe导出文件,整体压缩包仅6.9MB,轻量易解压。已有2813人学习下载,适合作为课程设计参考或自学项目模板。读者可直接导入Android Studio运行调试,结合设计报告中的详细功能说明与真实界面截图理解模块划分与实现逻辑,还可通过bat脚本与gradlew工具快速复现构建流程,降低环境配置门槛。 从选题到答辩,Android疫苗预约App全流程实录
每年到了期末,总有一批人被安卓大作业折磨得头秃。如果你正在做的是“智慧医疗——疫苗预约App”这类题目,或者你只是想在期末前找一个稳、好做、还能拿高分的项目方向,这篇东西应该能帮你省下好几个通宵。
我先说结论:疫苗预约App是一个非常适合做期末大作业的选题,功能边界清晰、需求便于展示、后续能扩展的空间也大。这篇文章会把我自己做一个完整项目时踩过的坑、选型逻辑、拆解思路全部摆出来,从选题分析到功能设计,从数据库建表到打包交付,从代码实现到设计报告怎么写,一条线讲完。文章里涉及的代码都是可以直接拿去改一改就用的版本,比你自己从零瞎琢磨要省力得多。
1. 项目整体设计与思路拆解
1.1 为什么选疫苗预约作为期末大作业
期末大作业最怕什么?怕题目看起来很大、做起来很虚。有些同学一上来就想做“全流程智慧医疗平台”,结果做了一两个月,需求理不清,功能做不完,最后交上去的东西既没深度也没完整度,答辩的时候被老师一问就露馅。
疫苗预约App的优势在于它的业务链路非常清晰:用户登录、浏览疫苗、选择接种点、选择时间、提交预约、查看记录。这条链路把移动端开发最核心的几个能力全都覆盖了——界面布局、数据存储、事件响应、列表展示、条件筛选、状态管理。它不是一个“看着很酷但做不出来”的项目,而是一个“认真做就能做得完整”的项目。对期末作业来说,这个属性比任何花哨的创意都值钱。
另外,疫苗预约本身是智慧医疗里一个很贴近日常的场景。评审老师看题目的时候不需要你解释背景,他一看就知道这个App在干什么,这就已经成功了一半。
1.2 项目核心功能与模块划分
我在动手之前,先把整个项目按照用户的操作习惯拆成了五个模块。这个拆分方式很重要,因为它直接影响你代码的目录结构、数据库的表设计和后期调试的效率。
第一个模块是登录注册。这部分负责用户身份的管理,我用的是手机号加密码的经典方案。这里有个经验:不需要做短信验证码,因为期末项目一般没有服务器资源去接第三方短信服务,用本地模拟的方式就好,界面和逻辑是完整的,老师也不会在短信接入上卡你。如果你想让项目更有亮点,可以把密码用MD5加密之后再存进数据库,这是很多同学容易忽略但很加分的细节。
第二个模块是疫苗信息展示。用户登录之后,首页展示当前可供预约的疫苗列表。一个比较直观的方案是让每张卡片显示疫苗名称、适用人群、可预约的剩余数量和一个“预约”按钮。这里我特意加了一个分类筛选功能,用户可以按“儿童疫苗”“成人疫苗”“流感疫苗”等类型进行切换。
第三个模块是预约流程。这是整个项目的核心。用户选择一种疫苗之后,进入预约页面,选择接种点和时间。这里最核心的是防重复预约逻辑和名额扣减逻辑,两个都是关系到项目能不能正常演示的关键点。
第四个模块是预约记录。用户预约完成后,可以在“我的预约”里看到自己的预约历史和当前状态。
第五个模块是个人中心。这一块主要负责用户信息的展示和修改,比如修改手机号、查看关于页面等,功能简单但能让项目结构更完整。
1.3 技术选型:Java还是Kotlin,SQLite还是云端
关于技术栈,我先说结论:语言用Java,数据库用SQLite,开发环境用Android Studio,这些就够了。
为什么不用Kotlin?不是说Kotlin不好,而是期末项目讲究一个“稳”。Java在Android开发里的学习资料最多,遇到问题搜索引擎上随手一搜就有解答。对安卓初学者来说,Java的静态类型和明确的语法可以让很多隐性错误在编译阶段就暴露出来,调试压力会小很多。如果你是在校生,课程大概率也是以Java为主讲的,那就更没必要在这个环节给自己添麻烦了。
数据库方面,SQLite是Android系统的内置轻量级数据库,不需要额外部署服务端,也不需要申请网络权限。数据存在本地,演示的时候稳定性极高,不会出现“连不上服务器”这种翻车事故。云端部署虽然听起来更高级,但会牵扯到后端开发、服务器运维、网络请求异步处理等问题,这些已经远超一般期末大作业的要求了。如果实在想加后端的内容,用LeanCloud之类的BaaS平台做一层数据同步就是极限了,再深入就不推荐了。
1.4 项目结构规划与代码目录组织
代码目录的组织直接决定你后期维护的时候是“痛苦万分”还是“轻松惬意”。我建议按照功能模块分包,而不是按照代码类型分包。对比说明一下:
- 按类型分包:com.example.vaccine.activity、com.example.vaccine.adapter、com.example.vaccine.db
- 按功能分包:com.example.vaccine.login、com.example.vaccine.vaccinelist、com.example.vaccine.reserve、com.example.vaccine.mine、com.example.vaccine.common
我用的方案是第二种。原因是:期末项目的事务逻辑大多围绕功能模块展开,按功能分包之后,改一个功能只需在一个包内操作,不用在activity包和adapter包之间来回跳。这在项目规模不大时差别不明显,但到了答辩前临时改需求的时候,你就知道这个习惯有多救命了。
2. 核心功能实现中的关键细节
2.1 登录注册模块的实现要点
登录注册是整个App的门面,也是老师第一眼会看到的功能,所以一定要做得完整、做得到位、做不出错。
注册页面需要收集手机号和密码,然后在用户点击注册按钮时做三个校验:手机号是否为空、手机号是否符合11位数字格式、密码长度是否大于等于6位。这些校验看起来简单,但如果不写,真机上输入异常数据就会闪退,是明显的减分项。我在项目里还加了一个二次确认密码的输入框,用来防止用户输错密码。
校验通过之后,把手机号和密码存入SQLite数据库中的user表。存储之前需要先判断这个手机号是否已经被注册过。这个逻辑很多人会漏掉,导致同一个手机号可以重复注册,被老师看到就会很尴尬。
登录逻辑就更直白了,根据输入框的手机号去数据库查user表,把查到的密码和输入的密码对比。这里有一层加密细节:存储密码的时候建议先用MD5加密再入库,登录时也把用户输入的密码先做同样的加密再对比。这样数据库里不会出现明文密码,也算是一个可以主动拿来讲的技术亮点。
2.2 疫苗列表展示与分类筛选
疫苗列表的展示我采用了RecyclerView + CardView的方案。RecyclerView是Android里做列表的王牌组件,配合CardView可以很轻松地做出卡片式布局的效果,视觉上比ListView高级不少。
每条疫苗数据我设计成四个字段:vaccineName(疫苗名称)、vaccineType(疫苗类型)、stock(剩余数量)和introduction(介绍)。列表项布局用一张相对完整的卡片,上方显示疫苗名称和类型标签,中间是介绍文字,底部放一个预约按钮。
分类筛选的核心逻辑其实就是在数据源上做文章。我预先在数据表里存了几种类型的数据,然后在界面顶部放了一个Spinner或者一组TabLayout,用户切换分类时重新查询数据库并且更新Adapter的数据集。
这里要注意的是,RecyclerView的Adapter在更新数据后必须调用notifyDataSetChanged()方法,否则界面不会刷新。这个坑看着小,但初学者经常栽在这里,而且报错信息不是很明显,排查起来很费时间。
2.3 预约流程与防重复预约设计
预约页是整个项目最核心的交互页面。用户选择疫苗后进入该页面,需要选择接种日期和接种时间段。日期可以用DatePicker控件,时间段我用的是一个RadioGroup,让用户从“上午9:00-11:00”“下午14:00-16:00”两个时段中二选一。
预约提交的瞬间要做几件关键事情。第一件,检查用户是否已经预约过这个疫苗。用SQL查一下预约记录表,如果当前用户ID加当前疫苗ID的组合在记录表中已经存在,并且状态是“已预约”,就直接弹Toast提示“您已预约过该疫苗”,并且阻止下单。这个逻辑在期末答辩时非常容易被追问,所以你一定要理解它的实现方式。
第二件,检查疫苗库存是否大于0,只有大于0才能预约。预约成功后要把库存减一,同时在这个表里插入一条预约记录。
这里我加了一个事务处理的细节。很多人会直接用两次独立的SQL操作来完成“扣库存加记录”这个流程,但实际上这两个操作应该放在同一个数据库事务里,要么都成功,要么都回滚,防止出现“扣了库存但没生成记录”这类脏数据。Android的SQLiteDatabase提供了beginTransaction()和setTransactionSuccessful()方法,用起来很简单,但能体现你对数据一致性的理解。
2.4 预约记录的查询与状态管理
预约完成之后,用户从首页底部的“我的预约”入口进入列表页,看到自己所有的预约记录。
在实现上,这里需要注意一个逻辑:预约记录的显示不能简单地把所有记录查出来,而应该按照预约日期排序,把还没到的预约放在前面,把已经过去的预约放在后面。排序逻辑我写在SQL语句里了,用ORDER BY字段处理,让展示效果更加合理自然。
状态管理是这部分比较值得展开的地方。每一条预约记录我都维护了一个status字段,用不同的数字表示不同的状态:0表示已取消,1表示已预约,2表示已完成。这里需要特别说一下“已完成”的处理方式:假设用户预约的是三个月后的日期,演示的时候不可能真的等三个月,所以我在查询时做了一个自动判断,如果当前日期晚于预约日期,就直接把这条记录在界面显示成“已完成”,同时更新数据库里的状态字段。
2.5 个人中心与信息管理
个人中心相对简单,但能撑起项目的完整度。我在这里放了三个入口:修改手机号、关于项目、退出登录。
修改手机号的做法是重新弹一个Dialog,让用户输入新的手机号,校验通过后更新user表。退出登录则是直接把登录状态清掉,回到登录页,并清空SharedPreferences中的登录标记。
3. 数据库设计与关键代码实现
3.1 三张核心数据表的建表SQL
数据库是整个项目的地基。我设计的数据库名是vaccine.db,里面包含三张表:user、vaccine和appointment。
user表主要包含两个业务字段,外加一个自增主键id:
CREATE TABLE user ( id INTEGER PRIMARY KEY AUTOINCREMENT, phone VARCHAR(11) UNIQUE NOT NULL, password VARCHAR(64) NOT NULL );vaccine表用来看疫苗数据:
CREATE TABLE vaccine ( id INTEGER PRIMARY KEY AUTOINCREMENT, vaccine_name VARCHAR(50) NOT NULL, vaccine_type VARCHAR(20) NOT NULL, stock INTEGER NOT NULL, introduction TEXT );appointment表是预约记录表:
CREATE TABLE appointment ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, vaccine_id INTEGER NOT NULL, reserve_date VARCHAR(20) NOT NULL, time_slot VARCHAR(20) NOT NULL, status INTEGER DEFAULT 1, create_time VARCHAR(30) NOT NULL );这里有几个设计细节值得说明。user表的phone字段加UNIQUE约束,从数据库层面杜绝了重复注册问题。appointment表里的status字段默认值为1,表示预约成功,0表示取消,2表示完成。create_time字段是为了排序和展示方便,存的是一个格式化的时间字符串,比如“2025-06-09 10:23:00”。
3.2 数据访问层封装:DBHelper与DAO
数据库操作我采用了DBHelper + DAO的结构。DBHelper继承SQLiteOpenHelper,在onCreate里执行建表SQL语句。DAO则是每个数据表的操作类,专门提供增删改查的方法。
用DAO类的核心价值在于,Activity里不应该直接出现SQL语句,否则代码会非常散乱,后期改一个字段名就可能要改十几个地方。我把数据访问统一封装,界面层直接调用方法就能获得List或者对象,这会让你的代码结构看起来项目感十足。
举一个查询疫苗列表的例子:
public List<Vaccine> getVaccineList(String type) { List<Vaccine> list = new ArrayList<>(); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor; if (type == null || type.equals("全部")) { cursor = db.rawQuery("SELECT * FROM vaccine", null); } else { cursor = db.rawQuery("SELECT * FROM vaccine WHERE vaccine_type = ?", new String[]{type}); } while (cursor.moveToNext()) { Vaccine vaccine = new Vaccine(); vaccine.setId(cursor.getInt(cursor.getColumnIndexOrThrow("id"))); vaccine.setVaccineName(cursor.getString(cursor.getColumnIndexOrThrow("vaccine_name"))); vaccine.setVaccineType(cursor.getString(cursor.getColumnIndexOrThrow("vaccine_type"))); vaccine.setStock(cursor.getInt(cursor.getColumnIndexOrThrow("stock"))); vaccine.setIntroduction(cursor.getString(cursor.getColumnIndexOrThrow("introduction"))); list.add(vaccine); } cursor.close(); return list; }Cursor的关闭是个小细节,但很多人都忽略。数据库连接和游标都是资源,用完不关会逐渐耗尽应用的可用资源,长时间运行后会变得卡顿。虽然期末项目的演示时间不长,但这个习惯需要从一开始就培养。
3.3 预约事务处理的完整流程代码
预约提交是整个项目中最需要严谨对待的一段逻辑。我用一个完整的事务来包裹“检查是否重复预约、扣减库存、插入预约记录”这三个步骤:
public boolean makeAppointment(int userId, int vaccineId, String date, String slot) { SQLiteDatabase db = dbHelper.getWritableDatabase(); boolean success = false; db.beginTransaction(); try { Cursor cursor = db.rawQuery( "SELECT id FROM appointment WHERE user_id = ? AND vaccine_id = ? AND status = 1", new String[]{String.valueOf(userId), String.valueOf(vaccineId)}); if (cursor.moveToFirst()) { cursor.close(); return false; } cursor.close(); ContentValues values = new ContentValues(); values.put("user_id", userId); values.put("vaccine_id", vaccineId); values.put("reserve_date", date); values.put("time_slot", slot); values.put("status", 1); values.put("create_time", getCurrentTime()); db.insert("appointment", null, values); db.execSQL("UPDATE vaccine SET stock = stock - 1 WHERE id = ? AND stock > 0", new Object[]{vaccineId}); db.setTransactionSuccessful(); success = true; } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); } return success; }注意这里UPDATE语句的写法: WHERE id = ? AND stock > 0,这个条件本身就是一个安全守卫,确保库存不会被减成负数。这是数据层防御性编程的体现,即使上层逻辑出了问题,底层数据也不会被破坏。
3.4 UI布局设计的几点实操经验
界面是老师对项目的第一印象,所以布局设计不能太粗糙。但这不意味着你要有设计天赋,只要遵循一些基本规则就够了。
统一配色是第一步。我用的是以浅蓝色为主色调的方案,因为医疗健康类App的主流配色都是蓝色系,看起来专业。按钮统一用圆角、主题色填充,文字深浅搭配一致,间距保持一致。
布局嵌套不要太深。很多初学者喜欢用多层LinearLayout嵌套来实现界面结构,结果布局渲染效率低,代码还非常难维护。建议用ConstraintLayout作为根布局,相对定位即可满足大部分需求,代码要清爽得多。
4. 打包交付:APK和“导出exe”的关系
4.1 为什么安卓App打包出来是APK而不是exe
很多同学在做这个题目的时候看到“导出exe文件”的要求会很疑惑:安卓App怎么可能导出exe文件?这里需要把这个概念掰开揉碎讲清楚。
安卓系统上运行的应用标准格式是APK(Android Application Package),它本质上是一个压缩包,里面包含代码、资源文件和清单文件。APK只能在安卓设备或者安卓模拟器上安装运行,Windows系统是不能直接运行的。
exe是Windows系统下的可执行文件格式,和安卓App根本不兼容。所以如果老师要求在电脑上演示安卓项目,正确做法不是“把APK转成exe”,而是“在电脑上安装一个安卓模拟器,然后在模拟器里安装APK”。
市面上的主流安卓模拟器包括MuMu模拟器、雷电模拟器、夜神模拟器等,任意一款都可以。安装模拟器后,把打包好的APK文件拖拽进模拟器窗口,它就会自动完成安装,然后就能在电脑上像用手机一样操作这个App。这是期末答辩时最稳妥、最常见的演示方案。
4.2 手把手教你用Android Studio打包APK
打包APK的具体流程我在实际操作中走了好几遍,步骤如下。
第一步,打开Android Studio,点击菜单栏的Build,选择Generate Signed Bundle / APK。这里如果选择APK选项,就是直接生成APK文件。
第二步,选择Create new keystore。密钥库是用来给APK签名的,安卓系统要求所有安装的应用必须经过数字签名。你需要填写一个密钥库的存储位置、密码,以及签名者的姓名和组织信息。这些信息随便填就可以,但密码一定要记住,因为后续更新App版本时还需要用同一个密钥库签名。
第三步,选择build type。一般选择release,这是发布版本的构建类型,会进行代码混淆和优化,生成的APK体积更小。debug类型是调试版本,主要给自己测试用。
第四步,点击Finish开始构建。构建完成后,Android Studio会弹出一个提示框,点击locate按钮可以直接在文件管理器中看到生成的APK文件。
这里还有一个经验要点:默认生成的release版APK在build目录下的路径一般是app/build/outputs/apk/release/app-release.apk。如果你想要一个更友好一点的文件名,可以在build.gradle文件里配置applicationVariants,或者在文件管理器里直接改名。
4.3 如果你真的被要求“导出exe文件”怎么办
如果课程要求里明确写了“导出exe文件”,可能存在两种情况。
第一种情况是老师口误或者表述不严谨。这时候你不需要纠结,按照安卓项目的标准做法打包出APK,然后在电脑上用安卓模拟器演示就可以了。演示效果和在手机上运行是完全一样的,本质上已经满足了“在电脑上运行这个App”的需求。
第二种情况是老师希望做一个桌面端的展示程序。这种情况其实也不难处理,Java生态里的JavaFX或者Swing可以做一个简单的桌面壳子,把安卓模拟器嵌入窗口,或者直接做一个模拟器快捷启动器。我曾经见过一个方案,用Java写了一个启动器逻辑,点击按钮就调用命令行启动模拟器并安装APK,然后在界面上引导用户到模拟器窗口操作。这种方式看起来像是“exe程序”,但实际上里面的App仍然是APK格式。不过说实话,除非课程要求非常明确,否则我不建议把时间花在这个壳子上,性价比太低。
顺带提一句,网上有一些“APK转exe”的工具,其实本质都是把安卓模拟器和你的APK打包在一起,生成一个Windows可执行文件,安装后自动运行模拟器。它们做的不是真正的格式转换,而是环境捆绑。如果老师一定要求有一个exe文件,你可以用这类方案应付,但要明白它的原理,别被绕进去。
5. 设计报告的撰写思路与答辩准备
5.1 设计报告的常规结构
期末大作业通常需要配套一份设计报告,这部分直接影响到分数。根据我做过的项目经验,一份能拿高分的报告不会堆砌套话,而是用清晰的结构把项目的来龙去脉讲明白。
报告的第一部分是项目背景和需求分析。这里要说明为什么做疫苗预约App,围绕智慧医疗的背景展开。需要注意的是,不要写太多网上复制来的大道理,要结合你自己的项目具体说:谁在用这个App、他们在什么场景下有预约疫苗的需求、系统需要具备哪些功能。
第二部分是功能设计。这一块要把需求分析细化,列出每个模块的具体功能点,最好配上功能结构图和界面原型草图。工具可以用ProcessOn画流程图,用Axure或者墨刀画原型,如果都不熟悉的话,直接用系统自带的画图工具画手绘风格草图拍照放进去也能接受。关键是让老师看到你在动手之前认真想过界面长什么样。
第三部分是数据库设计。把三张表的结构全部列出来,每个字段的类型、含义、约束条件都写清楚,配上E-R图。
第四部分是核心代码实现。展示项目里最核心的几个方法,比如登录校验、疫苗查询、预约事务等,配以解释说明。代码不要贴太多,挑三到五个最能体现技术点的片段就够了。
第五部分是测试报告。这是很多同学会忽略的部分,但恰恰是加分项。列出你测试过的功能点、测试步骤、预期结果、实际结果和测试结论。写成表格会非常清晰。
最后是总结和展望。简单总结学到了什么,再说一下这个项目之后可以考虑加哪些功能,比如疫苗库存预警、接种提醒推送、在线支付之类。
5.2 答辩中容易被问到的问题
答辩环节是很多同学的噩梦,但其实问题就那么几类,提前准备就行。
第一类问题是技术实现类。最常被问的是:数据库里三张表的关系是什么?预约时怎么防止重复预约?库存扣减的逻辑是怎么实现的?这类问题只要你是自己写的代码,基本都能答上来。
第二类问题是设计思路类。比如为什么用SQLite不用MySQL?为什么不接后端服务器?这类问题的核心回答思路是:从期末项目定位和成本角度解释,强调项目达到了课程教学目标。
第三类问题是改进方向类。比如如果这个项目要上线,需要做哪些改进?这就要说接入真实后端、使用HTTPS加密传输、增加短信验证码、完善隐私政策、对接真实医院的疫苗数据接口等。把这些问题提前想好,答辩的时候就能从容很多。
5.3 演示时的注意事项
现场演示是决定印象分的重要环节,我建议提前做三轮自测。
第一轮自测功能完整性,从登录注册到预约记录全流程走一遍,记录任何闪退或卡顿的环节并修复。第二轮自测边界情况,比如重复注册同一个手机号、重复预约同一个疫苗、库里疫苗库存清零后再预约,看看系统反应是否正常。第三轮是演示前模拟,完整地从头到尾走一遍流程,确保演示的时候不会卡壳。
另外一个很实用的建议是:在演示之前,把模拟器的数据清空,恢复到初始状态。这样演示时可以从注册账号开始,向老师展示完整流程。如果你在测试阶段已经积累了大量的预约记录,不清理的话演示时会显得很乱,甚至有之前测试的脏数据干扰展示效果。
6. 开发过程中的常见问题与排查实录
6.1 模拟器启动失败或运行卡顿
模拟器启动失败是安卓开发新手最容易碰到的第一个拦路虎。常见原因和处理方法我整理了一张速查表。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 模拟器启动黑屏 | AVD内存配置过低 | 编辑AVD配置,将内存调至2048MB以上 |
| 模拟器启动报错HAXM未安装 | Intel硬件加速未启用 | 在SDK Manager中安装HAXM,并确认BIOS里虚拟化技术已开启 |
| 模拟器运行极慢 | 电脑内存不足 | 关掉其他大型应用,或者在真机上调试 |
| Android Studio提示ADB端口被占用 | 其他工具占用5037端口 | 使用任务管理器结束adb.exe进程后重启 |
如果你的电脑配置一般,跑模拟器确实吃力,建议直接用真机调试。真机上点开USB调试模式,用数据线连接电脑,Android Studio会自动识别设备。
6.2 数据库升级后表结构不生效
开发过程中你会反复修改表结构,但SQLiteOpenHelper的onCreate方法只在数据库第一次创建时执行。如果你改了建表语句,重装App又麻烦,直接卸载App再重新安装就行,数据就会按新表结构创建。这个办法虽然粗暴,但很有效。
那有没有不卸载App的方案?就要用到了SQLiteOpenHelper的onUpgrade方法。当数据库版本号增加时,系统会自动调用onUpgrade,你可以在这里做表结构迁移。但期末阶段不建议在迁移上花时间,开发期直接卸载重装最高效。
6.3 RecyclerView数据更新后界面不刷新
这个我在前面已经提到过,因为太容易踩了所以再说一次。修改了数据源之后,必须调用adapter.notifyDataSetChanged()通知RecyclerView重新绘制列表。如果忘记了,现象就是数据明明改了但界面一直不变,很容易误以为数据库操作失败了。
6.4 真机调试时按钮点击无响应
真机调试时有一种情况困扰过很多人:点击按钮没有反应,但代码看起来没有逻辑错误。排查方法如下:先看是不是按钮高度或宽度太小,导致点不到有效区域;再看是不是有透明控件覆盖在按钮上面;最后Logcat里打印日志,确认点击事件有没有被触发。初学者最常见的问题是事件监听的注册代码和按钮ID对不上,写错了控件对象,点了一个地方,监听另一个控件。
6.5 打包时出现“Key was created with errors”
在创建签名密钥的时候,Android Studio有时会提示“Key was created with errors”,这个错误大概率不是真的错误,而是因为密钥库密码中包含了一些特殊字符,比如!或者@,导致校验时的兼容问题。解决方法是创建密钥时尽量用纯数字和字母组合作为密码,路径也不要有中文和空格。
这是一个很冷门但真实存在的坑,如果遇到了别慌,换一个简单的密码重新生成密钥库即可。
7. 完整开发流程清单,照着做就能出活儿
为了方便正在赶项目的人,我把整个开发流程变成了一张可以直接照着执行的清单。
- 环境准备:安装JDK 17、Android Studio最新稳定版,SDK Platform选择Android 12或14均可。
- 创建项目:新建Empty Views Activity项目,包名建议用com.example.vaccine。
- 设计数据库:创建三张表的建表SQL,写好DBHelper。
- 搭建用户模块:先写注册页面和登录页面,跑通用户注册和登录流程。
- 准备疫苗数据:在数据库里预置10条左右的疫苗数据,覆盖儿童疫苗、成人疫苗、流感疫苗等类型。
- 实现疫苗列表:完成RecyclerView和Adapter,加上分类筛选功能。
- 实现预约功能:完成预约页面的日期选择、时段选择,写好事务逻辑。
- 实现预约记录:完成记录列表的展示和状态管理。
- 完善个人中心:补充信息修改和退出登录功能。
- 整体测试:按测试用例跑一遍所有功能。
- 打包签名:生成签名APK,在模拟器上安装验证。
- 撰写设计报告:完成文档并整理答辩要点。
按照这个顺序做,每一步的成果都是可验证的,不会出现做到一半不知道下一步干什么的情况。
8. 个人实操经验总结
做了这么多安卓项目,有一个体会越来越深:期末大作业的技术难度从来不在于某个单点知识有多深,而在于你能不能把一条完整的业务链路用所有环节串起来。疫苗预约App的注册、登录、疫苗列表、预约、记录,看着每一块都是基础功能,但把它们连起来,保证数据正确流转、界面及时刷新、异常情况下不闪退,这本身就是对综合能力的检验。
如果你时间紧,先保证主流程通畅,再抠细节。先做能跑通demo的版本,再逐步加分类筛选、状态自动判断、MD5加密这些亮点功能。答辩的时候老师一般更关注你是否理解自己写的东西,而不是你的功能有多炫目。
我也建议你在做完之后,花半个小时再检查一遍代码里有没有不能解释的段子。答辩最尴尬的场景不是答不上来,而是被老师指着某段代码问“这是你写的吗”时,你支支吾吾说不出为什么这么写。自己写的每一行代码,都要能说出理由。
这就是我这次实践的全过程,希望能帮到正在为安卓期末大作业发愁的你。项目不难,但需要你一步步走,别慌,做完那一刻你会觉得一切都值了。
本文还有配套的精品资源,点击获取