ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

移动应用开发期末复习指南:从Activity生命周期到协程的考点梳理

移动应用开发期末复习指南:从Activity生命周期到协程的考点梳理 期末复习这种事最怕的就是翻开书觉得哪都学过合上书觉得哪都没记住。我当年复习移动应用开发这门课的时候状态基本是“Android Studio 一开就是一下午进度条转完一圈自己还是不知道从哪里下手”。后来把课程PPT、实验报告、往年卷子翻出来重新梳理了一遍才发现这门课的核心考点其实非常集中只是平时上课被零散的知识点打散了。这篇复习笔记当时的定位是给自己用的所以写得特别啰嗦专门把容易混淆、容易踩坑、考试里反复出现的点都标注了一遍。现在整理出来希望能帮到同样在为这门课头大的同学。移动应用开发这门课不管是Android方向还是跨平台方向考来考去逃不出这么几件事界面怎么写、组件怎么用、数据怎么存、网络怎么请求、异步怎么处理、项目怎么跑起来。这篇文章就按这个主线来拆结合福建省职业院校技能大赛“移动应用设计与开发”赛项里那些实际考核的落地点把期末复习和技能比赛要用的东西合并成一张网。无论你是平时听课似懂非懂的小白还是已经能独立写小项目的进阶选手都可以照着这个脉络查漏补缺。1. 期末复习的第一件事先摸清这门课的出题套路1.1 移动应用开发到底在考什么很多同学复习这门课时犯的第一个错误就是把所有时间花在“看代码”上。代码当然要看但考试题目里真正拉开差距的往往是那些“看不见”的东西——生命周期怎么流转、组件之间怎么通信、数据持久化的方案怎么选、网络层怎么设计。这些内容不会直接出现在界面截图里却决定了App能不能稳定运行。从课程考核的角度拆解移动应用开发的考点基本可以归为六大模块开发环境与工程结构、UI布局与控件、四大组件Activity、Service、BroadcastReceiver、ContentProvider、数据存储、网络与JSON解析、多线程异步处理。期末试卷如果是闭卷笔试名词解释、选择题、简答题、代码填空题主要集中在这六大模块如果是上机考试通常会要求你在规定时间内实现一个“具备基本业务功能”的小App比如新闻列表加详情、登录注册加数据展示、待办事项的增删改查。1.2 考点权重分析与复习优先级我对照了课程考核大纲和技能大赛的技术要求把复习权重按自己的判断排了个序仅供参考模块考点权重常见题型复习优先级Activity生命周期与Intent跳转高选择、简答、代码分析必拿分布局与常用控件高代码填空、界面改错必拿分数据存储SP、SQLite、文件中高简答、代码实现重点拿网络请求与JSON解析高上机题、综合题重点拿多线程与异步中选择、简答、代码纠错尽量拿四大组件剩余部分中选择、名词解释别丢分这个排序背后有一个逻辑凡是能通过“运行结果”直接验证的知识出题概率一定高。比如Activity跳转之后界面变化、点击按钮后文本更新、从数据库里查到数据显示在列表上这些都是肉眼可见的功能考试时最容易以完整题目出现。而那些偏原理、偏机制的考点比如Binder通信原理、ContentProvider底层实现更多以选择题或简答题出现知道“是什么”和“为什么这么设计”就够了不必纠结到底层源码。2. Activity、Fragment与界面开发最容易被考试突袭的部分2.1 Activity生命周期别只背七种状态要会推演场景Activity生命周期是移动应用开发里最经典的考点几乎每张卷子都有。很多人背“onCreate、onStart、onResume、onPause、onStop、onDestroy”背得滚瓜烂熟但考试只要换一种问法就懵了比如“用户正在使用App突然来了一通电话Activity按什么顺序执行哪些回调”这种题光背状态名称是没有用的你要完全跳出“七步列表”的思维把它想成一条状态流水线。以Android为例一个Activity从启动到退出完整生命周期是这样的onCreate创建做初始化、onStart可见、onResume可交互这三个是“前台三兄弟”当电话打进来、App被切到后台Activity依次走onPause失去焦点但仍可见、onStop不可见用户重新回到App时又走onRestart、onStart、onResume最终销毁时走onDestroy。复习的时候我建议你把这张表记在脑子里同时结合真实使用场景推演一遍点击Home键切后台、滑动返回、弹出一个Dialog、屏幕旋转。屏幕旋转这个点特别容易考因为默认情况下屏幕旋转会导致Activity被销毁重建如果不在onSaveInstanceState里保存状态用户旋转屏幕后输入框里的内容就会丢失。这个知识点既考原理又考应用上机考试里也经常拿来当隐性要求。2.2 Intent的显式与隐式跳转理解邮递员这个类比就够了Intent是组件间通信的“信使”这个概念本身不难但很多人写代码时只知道一种写法。显式Intent是指明确指定要跳转的目标组件代码写成val intent Intent(this, DetailActivity::class.java) intent.putExtra(id, 1001) startActivity(intent)这种写法在自己App内部页面跳转时最常用接收方通过getStringExtra(id)或getIntExtra(id, 0)把数据取出来。隐式Intent是不直接指定目标类而是声明action和category让系统去匹配哪个组件能处理这个请求。比如拨打电话、打开浏览器、调用系统相机就是典型的隐式Intentval intent Intent(Intent.ACTION_VIEW, Uri.parse(https://www.example.com)) startActivity(intent)考试时关于Intent的简答题最爱问“显式和隐式有什么区别”。你不要只答“一个指定目标类一个不指定”最好补一句“显式Intent用于应用内部组件跳转可靠性高隐式Intent用于跨应用调用由系统解析IntentFilter完成匹配灵活性高”。这样答案既有层次又有教科书上没有的加分表述。关于Fragment期末复习重点抓三点第一Fragment是嵌在Activity里的“子界面”有自己的生命周期但生命周期跟随宿主的Activity第二Fragment在Activity里通过FragmentManager和FragmentTransaction进行添加、移除、替换操作事务要记得commit()第三Fragment存活状态比Activity复杂不要手动new一个Fragment就完事要从布局和宿主生命周期去理解它为什么需要“懒加载”。上机题如果要求做底部导航栏多个页面的结构Fragment基本是标准答案。2.3 布局与控件XML和代码写UI的边界在哪里界面开发的题上机考的是“能不能在规定时间内还原一张设计图”笔试考的是“布局嵌套、权重分配、常见属性”。复习时重点掌握三种布局LinearLayout线性布局、RelativeLayout相对布局、ConstraintLayout约束布局。LinearLayout的layout_weight权重属性是高频考点。记住一个结论当父布局宽度固定子View想要按比例分配空间时就要靠权重。常见写法是宽度设为0dp再用weight分配比例。这里有个细节很多人吃亏——如果子View的宽度不设为0dp而是wrap_content或match_parent再叠加权重分配出来的空间比例会和你直觉里的“比例”完全不同。笔试的代码填空题特别爱在这一快设置陷阱。控件方面RecyclerView已经全面取代ListView成为主流但很多学校课程还在教ListView。如果考试考到ListView你要知道它必须有Adapter来填充数据如果上机环境允许你自己选优先用RecyclerView因为它的ViewHolder复用机制更清晰代码结构也更符合现代Android开发习惯。关于Adapter的写法核心就是getView()方法里convertView的复用判断面试和考试都爱问“为什么用convertView”答案很简单避免每次滚动都重新inflate布局提高列表滑动的性能。3. 数据存储与网络请求证明你真的做过App的关键模块3.1 本地存储方案怎么选三件套的适用边界移动应用的数据持久化期末复习基本围绕三种方案SharedPreferences、文件存储、SQLite数据库。SharedPreferences适合存“键值对”形式的轻量数据比如用户登录状态、App配置项、记住密码勾选项。它本质是一个XML文件存放在App私有目录下。复习要点getSharedPreferences()获取实例时有两种模式MODE_PRIVATE是默认私有模式读取时用getString(key, 默认值)写入时用edit().putString(key, value).apply()。记得apply()和commit()的区别——前者异步、返回void后者同步返回boolean有的考试填空题会专门考这个。文件存储适合结构化程度低的大数据比如用户头像图片、文本日志。Android内部存储和外部存储的权限机制在这两年的新版本里改动很大老教材写的WRITE_EXTERNAL_STORAGE权限已经过时了。考试如果考到你就回答“App优先使用内部存储不需要申请权限数据随应用卸载自动删除外部存储受分区存储机制限制读写受限”。这么答老师一眼就知道你更新过知识体系。SQLite数据库适合结构化关系数据比如学生成绩、订单记录、新闻列表的缓存。Android里操作SQLite有两种方式原生SQL语句加SQLiteOpenHelper辅助类或者用Room这一官方ORM框架。考试以SQLite原生写法为主因为要考你SQL语句基础。SQLiteOpenHelper的onCreate()和onUpgrade()两个回调方法必考数据库升级策略加一个字段、增一张表也要能写出对应SQL。3.2 HTTP请求与JSON解析的完整链路从URL到界面显示网络模块是移动应用开发的核心也是技能大赛“移动应用设计与开发”赛项的常客。一个完整的网络请求链路是这样构造URL和参数 - 发HTTP请求 - 服务器返回JSON字符串 - 本地解析JSON - 将数据填充到UI控件。传统写法用HttpURLConnection步骤繁琐URL对象、openConnection()、设置请求方法、设置超时、读取输入流、关闭连接。每个环节都有可能出现异常所以必须放到子线程不能在主线程执行网络请求这是硬性规定——Android系统要求网络请求不能在主线程运行否则会抛NetworkOnMainThreadException。这个知识点几乎每次考试都会以某种形式出现。现在的项目基本都用OkHttp或Retrofit做请求用Gson或Kotlinx.serialization解析JSON。如果你复习时间有限我建议至少看懂OkHttp的同步/异步请求写法以及Gson的fromJson和toJson两个核心方法。一个典型的数据类加解析代码长这样data class NewsBean( val id: Int, val title: String, val content: String ) // 解析 val gson Gson() val newsList: ListNewsBean gson.fromJson(jsonString, object : TypeTokenListNewsBean() {}.type)这里有一个新手极容易踩的坑JSON中的字段名和Kotlin/Java类的属性名对不上。比如服务器返回的是user_name你类里写的是userName解析就得不到值。解决办法是加SerializedName(user_name)注解。考试如果考JSON解析填空题九成是在这里设陷阱你要能一眼看出字段名映射不匹配。3.3 接口联调失败时的排查顺序上机考试里网络请求能不能通基本决定了一个项目能不能跑起来。根据我的经验接口请求失败时按这个顺序排查效率最高确认手机/模拟器能访问网络模拟器访问宿主机接口要写10.0.2.2不能写localhost。确认接口地址和请求方式正确是GET还是POST参数名是否匹配。查看日志看抛的是什么异常——超时、连接拒绝、协议错误原因完全不同。确认JSON解析模型类和返回的数据结构一致字段名、类型、嵌套层级都要逐层核对。确认已添加网络权限uses-permission android:nameandroid.permission.INTERNET /这是最常见的低级失分点。尤其最后一条经常出现的情况是代码写得没问题但清单文件忘了加网络权限结果第一次运行九成人都是一脸懵。这个细节不只是期末复习要注意技能大赛的比赛现场更致命——本来时间就紧如果基础环境出问题整个人状态直接崩掉。所以考前模拟一定要从“新建一个空项目能不能联网”这一步开始验证。4. 多线程与异步编程从Handler到协程的复习路径4.1 为什么网络请求不能放在主线程主线程也叫UI线程主要工作是绘制界面、处理触摸事件。如果主线程上执行耗时操作网络请求、大文件读写当耗时超过一定阈值比如5秒系统就会弹出“应用无响应”ANR提示。这里要理解的核心逻辑不是“主线程不能做事”而是“主线程要保持灵敏”所以要把耗时操作dispatch到子线程去等结果出来后再回到主线程更新UI。Android中实现“子线程执行任务、主线程更新结果”的传统方案是Handler Looper MessageQueue。Handler向消息队列发送消息Looper不断从队列中取消息取到后回调handleMessage()。你只要记住一句话Handler绑定的是创建它的那个线程的Looper所以在主线程创建的Handler它处理消息时就是在主线程上。这句话贯穿了整个机制的理解。4.2 从AsyncTask到协程写法在变核心思想不变老版教程喜欢讲AsyncTask但它已经被官方标记为废弃。不过很多学校教材还在讲考试如果考到你只要记住AsyncTask有三个泛型参数——Params传入参数类型、Progress进度类型、Result返回结果类型重写doInBackground()做耗时操作重写onPostExecute()回到主线程更新UI这样答就基本不丢分。现在的主流写法是Kotlin协程。协程本质上是一种“可以被挂起和恢复的轻量级线程”它能让我们用同步的代码风格写异步逻辑不再嵌套回调。核心概念三个CoroutineScope作用域、launch启动协程、Dispatchers线程调度器。结合网络请求的例子CoroutineScope(Dispatchers.Main).launch { val result withContext(Dispatchers.IO) { apiService.getNewsList() // 挂起函数自动切到子线程 } textView.text result.title // 回到主线程更新UI }withContext的作用很直白切到IO线程执行网络请求执行完自动切回原来的上下文。这种写法比回调嵌套可读性强太多。复习协程时你不必深究底层挂起原理重点是会用launch、withContext、Dispatchers三个API并且理解它们解决了什么问题。4.3 线程安全与共享变量的易错点多线程编程除了要会调度还要注意线程安全问题。比如两个线程同时修改同一个ArrayList可能出现数据错乱甚至崩溃。考试常考的选择题是“下列哪些做法可以保证线程安全”常见选项有加synchronized关键字、使用AtomicInteger、使用CopyOnWriteArrayList、直接ArrayList你要能一眼选中安全方案。还有一种典型场景是“多个子线程并发修改UI”这在Android里是绝对禁止的系统会抛CalledFromWrongThreadException。有些同学写完子线程代码直接在里面更新控件运行就崩溃还找不出原因。这个问题在技能大赛的现场调试环节出现频率特别高因为比赛编码时间紧张一急就容易把主线程和子线程的界限写乱。我的建议是写任何网络请求代码都先问自己一句“这句更新UI的代码最终执行在哪个线程”如果答案不是主线程那就要用机制把它切回来。5. 站在技能大赛视角看期末项目一套代码两头用5.1 技能大赛考核点与期末考点的重合地带“福建省职业院校技能大赛移动应用设计与开发”这类赛项比赛形式通常是给定需求文档在几个小时内完成一个功能完整的App并现场部署、演示答辩。这和期末大作业、上机考试的逻辑非常接近只是时间更紧、评分点更细。大赛评分一般分成几大块功能完整性、界面规范性、数据正确性、代码质量、答辩表现。仔细对照你会发现这些评分点恰恰就是期末实验报告的评分维度。所以我建议你如果期末有小组项目或大作业要求别只为交作业而写直接按比赛标准来做一个项目两边受益。具体来说至少要满足这几条项目能一键运行不崩溃环境问题提前清理、核心功能有逻辑闭环增删改查齐全、界面适配不同屏幕别只在模拟器一个尺寸下好看、数据来源尽量用真实接口或本地数据库别写死假数据糊弄。你把这些都做到了期末项目答辩时老师和比赛评委看到的是同一个作品你介绍起来也更有底气。5.2 比赛型App的MVP结构先跑通再说优化比赛和期末备考最大的区别是时间极度有限所以项目架构必须走MVP路径优先保证核心流程跑通再做锦上添花。我的建议是做一个比赛型App页面结构按老三样来主页面列表展示数据详情页展示具体信息个人设置页展示用户状态。技术栈上Activity Fragment RecyclerView OkHttp Gson SQLite就足够撑起一个常规赛题。不要一上来就用很复杂的MVVM架构、依赖注入框架因为比赛要求在短时间内产出稳定可运行的项目框架学习成本高出了问题也难排查。能用成熟熟练的方案就一定不要冒险。比赛现场还有一个常被忽略的点做好演示预案。真机演示有可能出现网络连不上、接口域名被封、电量过低之类的问题你要提前准备好本地mock数据在接口不通时能切换到本地缓存继续演示。这个思路在期末上机考试里也一样适用——如果考试环境网络受限功能演示不完全分数一定受影响。5.3 答辩时最容易被问到的问题期末项目答辩或比赛演示时评委大概率会围绕你的代码问这几个问题“这个列表的数据是怎么加载的是本地存储还是网络”“如果服务器返回的数据有1000条你怎么保证列表滑动流畅”“切换页面时数据是怎么传递的有没有考虑页面销毁后数据恢复”“你这个功能在低版本Android上能跑吗兼容性怎么保证”“网络断开时有没有对应的错误提示”这些问题听上去是在问功能实际上是在考察你对基本知识点的掌握是否扎实。建议你在答辩前把项目的网络请求流程、数据库表结构、关键页面生命周期逻辑各写一段一百字左右的口述说明不要背但要知道怎么用大白话讲清楚。这比临时想答案要稳得多。6. 考前一周自救清单查漏补缺和答题技巧6.1 概念题与高频问答题的速记要点到了考前最后一周已经不适合再从头看视频、啃大设计了这时候做三件事过概念、刷错题、上手练。高频概念题基本集中在这些地方Android四大组件是什么、Activity启动模式有哪些standard、singleTop、singleTask、singleInstance分别适用什么场景、Service和Thread的区别、ContentProvider的作用、ANR产生的原因、dp和px的区别。这些题目考的全是“知不知道”而不是“会不会写”所以复习策略是快速过一遍定义并配合一个小例子辅助记忆。比如Activity启动模式单纯背概念很容易混但如果配合场景记就好很多singleTop适合接收推送消息的页面来了一条新消息不希望界面反复重建singleTask适合App主页从其他页面跳回主页希望保留已有实例并把栈顶压到它singleInstance适合呼叫来电这类需要全局独立占用的界面。一个场景对应一个答案比死记灵活得多。6.2 上机题/实验题的常见失分点清单根据我观察身边同学踩过的坑上机考试常见失分点按概率排序大概是缺少运行时权限处理Android 6.0及以上动态权限不会弹窗直接崩溃。没有判断空指针从Intent取数据、从JSON取字段时直接访问不存在的key。在子线程更新UI导致崩溃。布局文件错误控件ID拼写不一致、约束不完整、图片资源引用错误。数据库表字段和实体类字段不匹配查询结果集遍历时索引越界。模拟器网络不通接口数据加载不出来一慌乱就开始乱改代码。忘记在Manifest里注册Activity或添加权限。针对这些失分点你在考前最后两天应该把以前写过的实验代码拿出来重点检查一遍是否踩过以上任意一条。尤其是第1条很多学校的实验环境用的是API 30以上版本如果代码里没有动态申请权限逻辑一运行就闪退辛辛苦苦写的功能全部白搭。6.3 考场上遇到没见过的题怎么办移动应用开发这门课题目再怎么出都绕不开“组件、界面、数据、网络、线程”这几个核心面。万一真遇到一个从没见过的问题比如“Fragment和Activity之间如何传值才安全”也不要慌可以从几个方向去拆解从数据流的角度想数据从哪里来要到哪里去用什么载体传递。从生命周期的角度想组件销毁重建后数据还在吗怎么保存。从用户行为的角度想用户会不会旋转屏幕、切后台界面会不会重置。从异常的角度想网络断了怎么办、数据为空怎么办、权限被拒绝怎么办。只要把这四层逻辑想清楚即使不知道标准答案也能写出一段逻辑合理、体现工程思维的解答得分一定比空白或瞎编强。最后再分享一个我认为最有效但很多人做不到的复习方式不要只看代码要把每个知识点动手跑一遍。哪怕只是新建一个空项目把一个列表从建表到数据展示完整走一遍你的理解深度都会上一个台阶。这段笔记写到最后我自己也重新把Android项目从零搭了一遍发现每次重做都能找出之前漏掉的细节——知识点这种东西只有在你亲手跑通一次之后才是真的属于你自己的。祝期末顺利代码一次编译通过。
返回列表