资讯详情

移动开发期末大作业指南:从零搭建备忘录App完整工程

📅 2026/10/3 14:52:25 | 华诺云谱 👁 阅读
移动开发期末大作业指南:从零搭建备忘录App完整工程
简介移动开发期末大作业的备忘录应用完整项目包。面向计算机相关专业正在完成课程设计或期末大作业的学生也适合需要安卓项目实战练习的开发者。项目经导师指导评审得分九十八分源码均本地编译通过并严格调试可直接参考运行也便于二次开发。资源共六十七个文件以安卓工程源码为主涵盖界面布局文件、Java逻辑代码、图片素材、项目截图、构建脚本以及安卓导入步骤与问题解决办法文档等多种类型整体包约四点零七MB结构紧凑便于下载使用。目前已有一百五十人学习可辅助快速理解备忘录应用的功能模块与界面实现涉及界面布局、事件响应、数据存储等移动开发核心知识点支撑课程设计的高分完成。1. 移动开发期末大作业怎么交得出手备忘录 app 是最稳的一个选题期末周一刷社交平台“移动开发 期末大作业”这几个字背后全是大半夜调不通布局的焦虑。老师给你一张选题表计算器、通讯录、备忘录看着哪一个都简单真动手才发现能跑起来已经算赢。备忘录 app 在这类题目里性价比最高功能边界清楚、数据持久化绕不开、界面不复杂但能展示的东西足够多。这份资源就是围绕这个题目做出来的完整工程带了导入文档和项目截图导入 Android Studio 改个包名就能跑通再花一晚上把样式和功能微调一下就是一份拿得出手的高分作业。适合正在赶移动开发大作业的学生也适合拿移动应用开发技能大赛练手的人——与其刷零散的移动应用开发笔记不如先有一份能跑通、能讲清每一行代码的完整底子。2. 备忘录 app 拆解一张表、一个 Adapter 和三段提醒逻辑拿到工程别急着点 Run先花二十分钟把结构过一遍。我见过太多人导入后直接跑能跑就交答辩时老师问“数据存哪了”当场卡壳。备忘录这种项目核心就三层数据层、列表展示层、提醒逻辑层。老师问的问题百分之九十围着这三层转把每一层的边界划清楚代码怎么写的、为什么这么写都能在脑子里对应起来。2.1 数据层为什么用 SQLite单表 CRUD 与时间戳字段设计为什么不用 SharedPreferences 或直接存 JSON 文件能存但数据库在备忘录这个场景里有三条不可替代的理由按 create_time 排序是原生支持的LIKE 模糊查询不用把整个列表读进内存以后加字段时 ALTER TABLE 一次搞定。SharedPreferences 存一个 List 也能实现 CRUD但排序和查询全靠内存硬算数据一多立刻露馅。老师问“为什么选数据库”这三条就是标准答案。public class MemoDbHelper extends SQLiteOpenHelper { private static final String DB_NAME memo.db; private static final int DB_VERSION 1; public MemoDbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE TABLE memo ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, remind_time LONG, create_time LONG NOT NULL, update_time LONG NOT NULL )); } Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 开发期可以删表重建但答辩时要说得出这个做法的隐患 db.execSQL(DROP TABLE IF EXISTS memo); onCreate(db); } }建表字段里有个容易被忽略的设计remind_time、create_time、update_time 全部用 LONG 存毫秒时间戳而不是 TEXT 存字符串。时间戳的排序、比较、格式化在任何语言里都有现成工具字符串格式的“2025-01-01 08:00:00”在排序时是按字典序走的格式一变就乱。DATABASE_VERSION 初始为 1每次改表结构必须加一同时重写 onUpgrade。我一般建议在 onUpgrade 里用 ALTER TABLE 加字段而不是 DROP 重建——DROP 会把用户数据全清掉这是个真实的扣分点。这里补一个读数据时容易翻车的细节Cursor 用完必须 close数据库用完要关。很多人只写了查询代码没关 Cursor跑一次两次没事反复进入页面后会出现“数据库未关闭”的崩溃日志而且时有时无属于典型的玄学故障。后面排查章节还会再提到。2.2 列表页与编辑页的数据流Adapter 绑 id 而不是绑 position列表页到编辑页再回到列表页刷新这条链路是整个 app 最容易写乱的地方。规范做法是MainActivity 的 onResume 里重新查库、刷新列表点击一条记录进编辑页时把 memo 对象的 id 通过 Intent 传过去编辑页用 id 重新查一次库而不是直接接收一个 Parcelable 大对象。Override public void onBindViewHolder(ViewHolder holder, int position) { Memo memo list.get(position); holder.tvTitle.setText(memo.getTitle()); if (memo.getRemindTime() 0) { holder.tvRemind.setText(formatTime(memo.getRemindTime())); } else { holder.tvRemind.setText(); } // 点击事件必须用 memo.getId()不能直接用 position holder.itemView.setOnClickListener(v - { Intent intent new Intent(context, EditActivity.class); intent.putExtra(memo_id, memo.getId()); context.startActivity(intent); }); }为什么要用 memo.getId() 而不是 position因为列表删除一条数据后RecyclerView 的 position 会整体前移你在第一条的位置点击实际绑定的可能是原来第二条的数据。用 id 做索引无论列表怎么增删点到的永远是你看到的那条。这里 setOnClickListener 放在 onBindViewHolder 里每次绑定都会重新 set虽然多几次赋值操作但能保证任何复用场景下点击事件都绑定最新数据。编辑页处理逻辑我习惯这样写拿到 intent 里的 memo_id调用 MemoDbHelper 的 queryById 查出当前最新数据回显到文本框。保存时先判断是编辑还是新增——id 不存在就是新增存在就是更新。更新要同时改 update_time列表排序依据就是它。这个逻辑不复杂但很值得画个草图答辩时老师喜欢问的就是这种数据流问题。2.3 提醒与搜索通知用 AlarmManager查询用 LIKE 带占位符提醒功能是备忘录里相对加分的模块也是最容易做成黑匣子的部分。很多初学者会用 Handler 延迟弹 Toast看起来也“提醒”了但进程被系统回收或者手机锁屏后Handler 根本不会执行。真实场景应该用 AlarmManager 定时触发广播配合 Notification 展示提醒内容。AlarmManager am (AlarmManager) getSystemService(ALARM_SERVICE); long triggerAt memo.getRemindTime(); Intent intent new Intent(this, RemindReceiver.class); intent.putExtra(title, memo.getTitle()); PendingIntent pi PendingIntent.getBroadcast( this, memo.getId().intValue(), intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); // targetSdk 31 以上必须加 FLAG_IMMUTABLE否则直接崩溃 am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAt, pi);这里两个参数是血泪经验。PendingIntent 的 requestCode 我直接用 memo.getId().intValue()保证每条备忘录的提醒互不覆盖——如果全部传同一个固定值后设置的提醒会悄悄替换掉前面的。FLAG_IMMUTABLE 是 targetSdk 31 之后的硬性要求不写的话在某些机型上会运行时崩溃。setExactAndAllowWhileIdle 需要 SCHEDULE_EXACT_ALARM 权限而且不少国产手机会限制精确闹钟演示时建议提前把 app 加入电池优化白名单或者退一步用 setWindow 这类宽限期接口就不需要敏感权限了。搜索功能用 LIKE 查询就够了不必引入全文检索组件。public ListMemo search(String keyword) { SQLiteDatabase db getReadableDatabase(); String sql SELECT * FROM memo WHERE title LIKE ? OR content LIKE ? ORDER BY update_time DESC; // 用 ? 占位符拼参数避免拼接字符串带来的转义问题 Cursor cursor db.rawQuery(sql, new String[]{% keyword %, % keyword %}); ListMemo list new ArrayList(); while (cursor.moveToNext()) { list.add(memoFromCursor(cursor)); } cursor.close(); return list; }LIKE 语句里的 % 是通配符放在关键词两侧表示包含匹配。用 ? 占位符而不是直接拼字符串能避开内容里带引号、分号导致的 SQL 注入或者转义错误这门课里可能不考安全但老师会看你的代码习惯。大小写方面SQLite 默认对 ASCII 字符做大小写不敏感匹配中文不受影响所以备忘录搜索中文关键词没有问题。3. 从导入到改名Android Studio 里过一遍最稳的五步资源拿到手不是解压就完事导入工程这件事本身有不少细节。很多同学在导入环节就被卡住Gradle 转圈、SDK 版本不匹配、依赖拉不下来。这一章按顺序走每一步都确认到位再往下操作就不会积压错误。3.1 导入前先看三个节点Manifest、Gradle 与目录结构导入之前先别双击 open 目录用文本编辑器先看三个文件AndroidManifest.xml、build.gradle模块级、目录结构里 src 下的包路径。这三个文件决定了工程能不能编译也决定你要改哪些地方。Manifest 里主要看权限声明和 application 的 labelGradle 里看 compileSdk 和 targetSdk目录结构看主包名。uses-permission android:nameandroid.permission.POST_NOTIFICATIONS / uses-permission android:nameandroid.permission.SCHEDULE_EXACT_ALARM / application android:label备忘录 android:themestyle/Theme.MemoApp activity android:name.MainActivity / activity android:name.EditActivity / /applicationandroid:label 是桌面显示的应用名默认叫“备忘录”没关系交作业前改成自己的名字更稳妥。POST_NOTIFICATIONS 权限是 targetSdk 33 及以上版本运行时必须申请的后面排查通知不弹会重点讲。SCHEDULE_EXACT_ALARM 前面提过是精确闹钟专用权限如果代码里用了 setExactAndAllowWhileIdle 就必须保留否则用 setWindow 的话这条权限声明可以删掉。Gradle 配置看这一段就够了android { compileSdk 34 defaultConfig { applicationId com.example.memoapp minSdk 21 targetSdk 34 versionCode 1 versionName 1.0 } }minSdk 21 意味着支持 Android 5.0 以上的所有设备覆盖绝大多数教学机和模拟器compileSdk 和 targetSdk 用 34 是因为新版 Android Studio 对旧版本兼容性差编译 SDK 太低会报一堆废弃警告。这里最容易搞混的是 applicationId 和 namespaceapplicationId 是应用唯一标识决定安装时的包名namespace 决定 R 文件在哪个包下引用。改 applicationId 不需要动代码里的 import改 namespace 才需要。所以交作业时只改 applicationId 即可代码一行都不用动。3.2 改包名与应用名的标准姿势Refactor 而不是手动改目录拿到工程要把包名从 com.example.memoapp 改成你自己的学号或姓名拼音这是大作业基本操作。常见的翻车做法是右键目录一个个重命名然后把所有 import 语句手动改一遍改完发现 R 文件仍然报红问题就出在 namespace 没同步。标准做法是用 Android Studio 的 Refactor 功能在项目视图中右键主包名选 Refactor Rename然后选 Rename package输入新包名确认后 IDE 会同步更新所有 import 和 namespace。执行完 Refactor 之后回到 build.gradle 里再确认一遍 applicationId把它改成新包名然后点击 Sync Now。R 文件报红一般是同步没完成或 namespace 没刷新这时候做到这两件事干净编译一次就能解决。还有一个细节包名分级不要带大写字母和中文Android 包名规范是小写字母和下划线。别用“张三的备忘录”这种名字当包名编译器直接拒绝。学号拼音加 memo比如 m2024001memo简单又不重名交作业和答辩都方便。3.3 按“能讲清”的标准读一遍代码四个文件对应四个问题工程跑通之后别急着截图交差。老师答辩时会让你讲代码讲法有讲究——顺着数据流讲最不容易被打断。我建议按这个顺序读代码AndroidManifest.xml 看入口和权限Memo.java 看实体字段MemoDbHelper.java 看数据库操作MemoAdapter.java 看列表绑定MainActivity 和 EditActivity 看页面跳转。这个顺序的本质是老师问“数据从哪来、显示在哪、改完存哪去”你能一条线串下来。读代码时重点背住四个问题的答案建表语句里的字段各是什么含义新增和编辑两条路径的分叉点在哪个方法里列表刷新是 onResume 里重新查库还是手动改内存集合提醒时间存的是时间戳还是字符串。这四个问题能对答如流答辩基本稳了。4. 让截图替你说服老师演示路径与答辩问答清单这个资源里附带了一批项目截图但如果你只是原样用老师的印象分和直接用网图差不了多少。截图的真正作用是让人“还没跑代码就看出工作量”所以要会截、会选、会排顺序。4.1 项目截图怎么截才有信息量四种状态缺一不可备忘录这种工具类 app想通过截图展示功能至少需要四张干净的列表页、带提醒时间的列表页、编辑页填好内容的形态、通知栏弹出提醒的形态。列表页要有真实数据别只留一条“测试”记录躺在那儿输入几条生活化的内容比如“周五 14 点交移动开发实验报告”“周六上午去图书馆还书”老师一眼就能进入场景。编辑页截图要展示标题、正文、提醒时间三项都填齐的状态证明表单完整性。通知栏截图要拍到状态栏里的 app 图标和提醒文字这是最容易漏但最有说服力的一张。截图工具用系统自带的就行别让屏幕上挂着无关窗口和通知。把模拟器状态栏的时钟调准一点分辨率固定一种别几张截图横竖不一。图片统一命名建议01_list_empty.png、02_list_with_data.png、03_edit.png、04_notification.png放进报告里脉络很清楚。4.2 两分钟演示路径把功能串成一条线答辩演示时间通常只有两三分钟很多同学从头到尾点一遍界面时间到了还没演示到关键功能。我习惯把演示顺序设计成一条有因果关系的路径让老师觉得每一步都是设计过的。顺序操作老师应该看到什么1打开 app展示空列表首页布局、空数据态处理2新建第一条备忘录带提醒时间编辑页表单校验、保存成功提示3返回列表刷新出新数据onResume 重新查库、列表更新4点击进入编辑改标题后保存编辑复用同一页面、update_time 更新5下拉或点搜索输入关键词LIKE 模糊查询、结果列表6演示删除列表同步移除删除确认、数据持久化最后一步演示提醒比较冒险——如果提醒时间设置得太远演示现场等不到弹通知如果设置得太近刚退出编辑页就弹出来又显得太刻意两种。我建议设置成当前时间往后推一分钟先去做别的演示一分钟刚好回来看到通知节奏最自然。要是现场等不及就把提醒那一分钟的等待变成讲代码的时间讲完 AlarmManager 的设定逻辑通知正好弹出来无缝衔接。4.3 答辩高频问题数据持久化、生命周期与进程被杀课程答辩问的问题翻来覆去就那么几个提前准备好素材等于开卷考试。数据持久化怎么回答保存时 insert 或 update 到 SQLite列表页 onResume 时重新从数据库查询并刷新列表所以 app 重启后数据还在。类 App 的生命周期怎么用编辑页在 onSaveInstanceState 里存输入框内容配置变化或意外销毁时恢复。进程被杀之后怎么办只要数据已经落库重启后查询就能恢复还没保存的输入靠 onSaveInstanceState 兜底。列表复用机制RecyclerView 的 ViewHolder 复用避免每次滚动都重新创建视图这也是用 getOnClickListeners 那套写法能流畅滚动的原因。如果你同时还在备赛移动应用设计与开发赛项广东高职这类比赛和课程答辩问的方向基本是重叠的底层还是数据持久化和界面刷新的逻辑把上面这套素材吃透两边都够用。5. 备忘录 app 常见问题排查五个高频翻车现场与修复顺序这一章全是真实踩过的坑。每条按“现象 → 原因 → 解决”推进按出现概率排序导入工程之后如果遇到问题先对照前三条命中率极高。5.1 Gradle Sync 卡在下载依赖进度条一动不动现象新建或导入工程后 Gradle 一直转圈小窗口显示正在下载 gradle-xxx.zip有时等半小时还停在 99%。原因Gradle 发行版和依赖仓库都在国外服务器上国内网络下载不稳定这是最常见的外部因素也是被误报最多的故障。解决先检查 gradle-wrapper.properties 里指定的 Gradle 版本再在 build.gradle 的 repositories 里临时追加国内镜像repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/central } maven { url https://maven.aliyun.com/repository/gradle-plugin } }追加之后重新 Sync下载速度会明显改善。这条镜像配置只在本地工程生效不影响其他人的构建。另外注意别把 maven.aliyun.com 的地址写到 buildscript 块之外位置放错了依然走默认仓库。5.2 模拟器上跑得流畅真机安装时提示解析包错误现象模拟器一切正常换成真机安装 APK系统提示“解析包时出现问题”或“未安装应用”。原因minSdk 高于真机系统版本或者 APK 签名方式与系统要求不符。解决检查 build.gradle 里的 minSdk改成 21覆盖 Android 5.0 以上所有机型同时确认 targetSdk 不要超过真机系统版本太多。还有一类原因是有部分旧机型对 split APK 兼容不好直接在 Run 时选择 APK Analyzer 生成完整 APK 即可别用 instant run 的中间产物。5.3 删除一条数据后列表显示错乱或点击到错误记录现象列表本来五条数据删除第二条后剩余条目显示顺序没问题但点第一条跳转的是之前第二条的内容。原因item 点击事件里绑定了 postion删除后列表整体位移position 的位置号不变但实际数据变了典型的数据与视图解绑错误。解决回头检查 onBindViewHolder 里点击事件闭包捕获的对象保证捕获的是 memo.getId() 而不是 int position。这个坑在 RecyclerView 和 ListView 里都一样凡是列表数据会动态增删一律锁 id 不锁下标。5.4 通知设置成功但就是不弹静默无声现象提醒时间到了Logcat 能看到广播接收器执行了但状态栏没有通知。原因targetSdk 33 及以上必须在运行时申请 POST_NOTIFICATIONS 权限只在 Manifest 里声明没用另外部分模拟器的通知默认就是关闭的设置里检查是否把 app 的通知权限给禁了。解决MainActivity 启动时动态申请通知权限用 ActivityCompat.requestPermissions 一次性申请通知和闹钟权限。演示前先手动确认一次系统设置里该 app 的通知开关是打开的这个检查花十秒钟能省掉现场十分钟尴尬。5.5 改了包名后 R 文件报红整屏 import 错误现象手动改了包名目录刷新后大量 import com.example.memoapp.R 报红编译失败。原因手动改目录没有同步更新 namespaceR 文件的生成路径还指向旧包。解决不要手动改目录结构删掉这个状态后重新用 Refactor Rename Rename package 走一遍然后同步 applicationId。如果已经报了红先执行 Build Clean Project再同步 Gradle一般能恢复。这个坑的本质是 namespace 与 applicationId 的区分没掌握建议把这两个字段的功能关系理顺再动手反复试错只会让资源目录越改越乱。6. 交付前最后一件事用 adb 拉出数据库验证落盘“能跑”这件事对期末大作业来说只是及格线数据持久化是不是真的落盘了值得你用一条命令验证。很多同学演示时重启 app 看到数据还在就以为是持久化的功劳其实那可能是进程还在后台没被杀掉。最可靠的验证方式是直接把数据库文件从应用私有目录里拉出来看。adb shell run-as com.example.memoapp ls /data/data/com.example.memoapp/databases/ adb shell run-as com.example.memoapp cat /data/data/com.example.memoapp/databases/memo.db memo_local.db第一条命令列出数据库目录下的文件确认 memo.db 真实存在第二条命令把数据库文件从应用私有目录导出到电脑然后你可以用可视化工具或 sqlite3 打开直接查看 memo 表里的记录。run-as 只能作用于 debug 版本应用正式签名的 release 包会拒绝执行所以这套操作要在开发调试阶段完成。导出的 memo_local.db 放在报告附件里答辩时打开给老师看比口头说一百遍“我用的 SQLite 存储”都有说服力——表结构、字段、数据都在文件里摆着这是数据持久化最直观的证据。答辩讲代码时按照功能层、数据层、异常处理层三层去组织话术功能层讲增删改查与搜索提醒数据层讲 SQLite 表设计和 onResume 刷新机制异常处理层讲权限申请和空列表兜底。这三层讲完老师基本能确认你是做过完整项目的。说句实话我第一次交移动开发大作业时因为没验证落盘真机上删了数据又重启直接翻车。从那以后每次交项目前哪怕是课程小练习我都会强制走一遍导出数据库的流程再顺手看一眼表里的数据有没有脏记录。这个习惯帮我避免过至少三次现场崩溃的尴尬。资源里的导入文档和项目截图也都是按这个标准整理的直接拿来用就能省掉一大部分整理工作量。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑