news 2026/9/30 16:23:33

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
移动应用开发期末复习指南:从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,让系统去匹配哪个组件能处理这个请求。比如拨打电话、打开浏览器、调用系统相机,就是典型的隐式Intent:

val 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: List<NewsBean> = gson.fromJson(jsonString, object : TypeToken<List<NewsBean>>() {}.type)

这里有一个新手极容易踩的坑:JSON中的字段名和Kotlin/Java类的属性名对不上。比如服务器返回的是user_name,你类里写的是userName,解析就得不到值。解决办法是加@SerializedName("user_name")注解。考试如果考JSON解析填空题,九成是在这里设陷阱,你要能一眼看出字段名映射不匹配。

3.3 接口联调失败时的排查顺序

上机考试里,网络请求能不能通,基本决定了一个项目能不能跑起来。根据我的经验,接口请求失败时,按这个顺序排查效率最高:

  1. 确认手机/模拟器能访问网络(模拟器访问宿主机接口要写10.0.2.2,不能写localhost)。
  2. 确认接口地址和请求方式正确(是GET还是POST,参数名是否匹配)。
  3. 查看日志,看抛的是什么异常——超时、连接拒绝、协议错误,原因完全不同。
  4. 确认JSON解析模型类和返回的数据结构一致,字段名、类型、嵌套层级都要逐层核对。
  5. 确认已添加网络权限:<uses-permission android:name="android.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 上机题/实验题的常见失分点清单

根据我观察身边同学踩过的坑,上机考试常见失分点按概率排序大概是:

  1. 缺少运行时权限处理(Android 6.0及以上动态权限不会弹窗,直接崩溃)。
  2. 没有判断空指针(从Intent取数据、从JSON取字段时,直接访问不存在的key)。
  3. 在子线程更新UI导致崩溃。
  4. 布局文件错误:控件ID拼写不一致、约束不完整、图片资源引用错误。
  5. 数据库表字段和实体类字段不匹配,查询结果集遍历时索引越界。
  6. 模拟器网络不通,接口数据加载不出来,一慌乱就开始乱改代码。
  7. 忘记在Manifest里注册Activity或添加权限。

针对这些失分点,你在考前最后两天,应该把以前写过的实验代码拿出来,重点检查一遍是否踩过以上任意一条。尤其是第1条,很多学校的实验环境用的是API 30以上版本,如果代码里没有动态申请权限逻辑,一运行就闪退,辛辛苦苦写的功能全部白搭。

6.3 考场上遇到没见过的题怎么办

移动应用开发这门课,题目再怎么出都绕不开“组件、界面、数据、网络、线程”这几个核心面。万一真遇到一个从没见过的问题,比如“Fragment和Activity之间如何传值才安全”,也不要慌,可以从几个方向去拆解:

  • 从数据流的角度想:数据从哪里来,要到哪里去,用什么载体传递。
  • 从生命周期的角度想:组件销毁重建后,数据还在吗,怎么保存。
  • 从用户行为的角度想:用户会不会旋转屏幕、切后台,界面会不会重置。
  • 从异常的角度想:网络断了怎么办、数据为空怎么办、权限被拒绝怎么办。

只要把这四层逻辑想清楚,即使不知道标准答案,也能写出一段逻辑合理、体现工程思维的解答,得分一定比空白或瞎编强。

最后再分享一个我认为最有效但很多人做不到的复习方式:不要只看代码,要把每个知识点动手跑一遍。哪怕只是新建一个空项目,把一个列表从建表到数据展示完整走一遍,你的理解深度都会上一个台阶。这段笔记写到最后,我自己也重新把Android项目从零搭了一遍,发现每次重做都能找出之前漏掉的细节——知识点这种东西,只有在你亲手跑通一次之后,才是真的属于你自己的。祝期末顺利,代码一次编译通过。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 16:23:25

Jev 结构化决策模型:TypeSafe AI 与 RLCD 实战指南

1. 从“不说话”的模型说起&#xff1a;Jev 到底在解决什么问题第一次看到“Jev”这个名字&#xff0c;加上“前 OpenAI 研究员做的‘不说话’模型”这个描述&#xff0c;我脑子里冒出来的第一个疑问是&#xff1a;一个不输出自然语言的模型&#xff0c;到底能拿来干什么&#…

作者头像 李华
网站建设 2026/9/30 16:23:16

YOLO疼痛检测数据集:从训练到部署的完整实战指南

做目标检测的人拿到"疼痛检测数据集"这个名字&#xff0c;第一反应多半是&#xff1a;疼痛这种主观体验&#xff0c;也能拿来训YOLO&#xff1f;我自己接手这套2200张的YOLO格式医疗健康数据集时&#xff0c;同样是先愣住&#xff0c;然后一张一张图翻完标注文件&…

作者头像 李华
网站建设 2026/9/30 16:22:24

AI+CAD工程落地实战:从DXF/DWG解析到FreeCAD与OpenCASCADE全链路

1. 从Demo到工程&#xff1a;AICAD落地的真实鸿沟 过去两年&#xff0c;我参与过三个AI辅助CAD的项目&#xff0c;从图纸识别到参数化生成&#xff0c;从二维线稿到三维重建&#xff0c;几乎每个方向都摸过一遍。最深的感受就是&#xff1a; Demo演示和工程落地之间&#xff0…

作者头像 李华
网站建设 2026/9/30 16:20:43

Octo-ASR+OCTO工作流:从语音转写到会议纪要自动生成与待办派发

开完项目会&#xff0c;录音躺在文件夹里&#xff0c;群里已经开始有人问“纪要呢”&#xff0c;这类场面你可能比我更熟。以前我的做法是把录音拖进播放器&#xff0c;边听边敲键盘&#xff0c;一小时的会至少搭进去两小时整理&#xff0c;最后列出来的待办还总是漏项&#xf…

作者头像 李华
网站建设 2026/9/30 16:20:08

Jev 模型实战:TypeSafe AI 结构化决策与 RLCD 训练路线解析

1. 从"聊天机器人"到"决策引擎"&#xff1a;Jev 到底在解决什么问题 大多数人第一次听到 Jev 这个名字&#xff0c;第一反应是"又一个套壳大模型"。但如果你真的去翻它的设计文档和演示案例&#xff0c;会发现它走了一条完全不同的路——它不聊天…

作者头像 李华
网站建设 2026/9/30 16:18:50

MTIA存内计算架构:破解AI推理的存储墙与功耗困局

1. 项目概述&#xff1a;这不是又一个“自研芯片”的宣传稿&#xff0c;而是Meta在AI算力军备竞赛中的一次硬核突围“速度与破局”这四个字&#xff0c;放在Meta的AI芯片故事里&#xff0c;不是修辞&#xff0c;是倒逼出来的生存逻辑。过去三年&#xff0c;我跟踪过十几家科技巨…

作者头像 李华