
每年春招一到Android岗的笔试题就成了很多人的心病。我自己当年准备校招时把市面上能搜到的真题都翻了个遍其中京东这套2019春招的开发类试卷给我留下的印象很深——题目本身的难度不算变态但覆盖面非常典型既有Java基础、数据结构这种通用考点也有四大组件、Handler、性能优化这类Android核心知识几乎就是一份浓缩版的Android岗必考清单。哪怕你求职的目标不是京东把这份试卷的考点逐条吃透也足够应对大部分互联网公司的Android校招笔试了。这篇文章不打算贴原题和标准答案那没什么参考价值。我按自己多年面试和带新人的经验把这类试卷背后真正想考察的东西拆开讲清楚包括每类考点的复习优先级、常见出题方式以及一些容易被忽略的细节。无论你是正在准备校招还是工作了几年想回头补基础这份复盘应该都能用得上。1. 京东春招试卷整体考察思路1.1 试卷结构与分值分布解析京东这套Android开发试卷整体沿用互联网公司笔试的经典结构单选、多选、简答外加一两道编程题。从分值比例来看Java基础和Android核心差不多各占三成数据结构与算法占两成剩下的一成分散在计算机网络、操作系统和设计模式上。这个比例很能说明问题大厂校招笔试题的定位不是筛选“会用某个框架的人”而是筛选“基本功扎实、值得培养的人”。选择题部分一般有20到30道每道2到3分覆盖的知识点非常杂。比如让你判断“下列哪个不是Activity的启动模式”“Looper.loop()为什么不会阻塞主线程”“哪种进程间通信方式适合传递大文件”这类题目题干看似简单但每个选项都是精心设计的陷阱。多选则更让人头疼少选不得分多选也不得分这对知识掌握的精准度要求很高。简答题通常是2到3道围绕内存泄漏、自定义View、消息机制等核心主题展开要求你写出完整思路。编程题一般是1到2道以LeetCode中等难度为主但时间非常紧张必须在完成前面题目的同时留出足够时间。我的建议是先易后难选择题控制在40分钟内完成简答题每题控制在10分钟编程题留足30分钟。千万不要在某道选择题上纠结太久笔试的容错率远比大家想象的高一道题两三分丢了就丢了为了它导致后面大题没时间做才是真正的损失。1.2 考点覆盖范围与难度定级把这套试卷的考点拉一个表基本就能看清Android校招笔试的全貌。我按复习的优先级把这些考点分成了三个梯队这个分法不仅适用于京东对其他大厂也有参考价值。第一梯队是必考且必须拿分的包括Java集合与并发、四大组件、Handler消息机制、Activity启动模式和Intent传递。这些是Android开发的地基无论哪家公司的笔试题都会出现。第二梯队是出现频率高但深度可控的包括自定义View绘制流程、RecyclerView缓存机制、内存泄漏场景、ANR产生原因、进程间通信方式和多线程编程。第三梯队是偶尔出现但容易被忽视的包括JVM内存模型、类加载机制、设计模式、HTTP协议细节以及SQLite数据库操作。从难度上看选择题大多停留在概念辨析层面只要系统复习过《Android开发艺术探索》和《第一行代码》就能覆盖。简答题开始考察表达能力光知道结论不够还要能把原理讲清楚。编程题才是真正拉开差距的地方它同时考察数据结构和算法功底以及代码规范和边界条件意识。比如手写一个单例模式、反转链表、两个线程交替打印数字题目本身不难但能不能在20分钟内写出无Bug的代码很考验基本功。2. 高频核心考点深度拆解2.1 四大组件的原理与生命周期四大组件几乎是所有Android笔试题的必考内容而其中考得最多的就是Activity。启动模式作为最经典的基础题几乎每套试卷都会出现。standard、singleTop、singleTask、singleInstance这四种模式的区别和应用场景必须烂熟于心standard每次启动都会创建新实例singleTop在栈顶复用适合接收通知跳转的场景singleTask确保栈内只有一个实例适合应用主页面singleInstance则单独占一个任务栈适合来电界面这种需要全局唯一的场景。笔试还经常让你判断“A启动B两个Activity的生命周期回调顺序”答案是A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop这个顺序很多人会记错需要特别注意。Service和BroadcastReceiver也经常考。Service有两种启动方式startService和bindService它们的生命周期差异是高频考点startService启动的Service与启动者没有关联即使Activity销毁Service仍然运行bindService则与绑定者绑定在一起所有绑定者解绑后Service就会销毁。Android 8.0以后后台启动Service受限Android 9.0以后不能从后台启动Activity这些限制也常作为选择题的选项出现。BroadcastReceiver的注册方式分为静态注册和动态注册动态注册需要在onDestroy中反注册否则会泄漏这也是一个容易被忽略的考点。ContentProvider虽然平时开发用得不频繁但笔试还是会考。它作为跨进程数据共享的标准化接口底层实现是Binder。Android 7.0以后FileProvider作为ContentProvider的子类开始被广泛使用用于解决应用之间共享文件时暴露file://URI的安全问题。热词列表里频繁出现的content://com.baidu.searchbox.fileprovider/...和content://com.ss.android.uri.key/...就是典型的FileProvider授权路径理解了这个结构也就理解了ContentProvider的实际应用场景。2.2 Handler消息机制与异步任务Handler消息机制是Android笔试的“钉子户”几乎100%会出现。它的核心组件包括Handler、Looper、MessageQueue和Message。Looper负责循环取消息MessageQueue是消息队列Handler负责发送和处理消息。整个机制的关键在于Looper.loop()这个死循环它不断从MessageQueue中取消息如果没有消息就阻塞等待这就是主线程不会因为Handler机制而卡死的原因。笔试中经常出现的坑点是“为什么主线程的Looper不需要手动创建”。答案是在ActivityThread的main方法中系统已经调用了Looper.prepareMainLooper()所以应用代码中可以直接new Handler()。而子线程中创建Handler之前必须先调用Looper.prepare()再调用Looper.loop()否则会抛出RuntimeException: Cant create handler inside thread that has not called Looper.prepare()。这个异常信息建议记住原文面试时直接背出来会显得对原理很熟悉。另一个高频考点是Handler导致的内存泄漏。非静态内部类的Handler会持有外部Activity的引用如果MessageQueue中还有未处理的消息Activity就无法被回收。标准解法是把Handler声明为静态内部类使用WeakReference引用Activity并在onDestroy中移除所有回调。这套解法既能出现在简答题里也能作为选择题的选项。2.3 自定义View与绘制流程自定义View也是笔试的重点考察的核心是measure、layout、draw三大流程。onMeasure决定View的大小onLayout决定子View的位置onDraw决定绘制的内容。对于自定义ViewGroup需要重写onMeasure和onLayout对于自定义View通常只需要重写onDraw。笔试中常见的一道题是“MeasureSpec的三种模式分别是什么”。UNSPECIFIED表示父容器对子View没有限制EXACTLY表示父容器已经确定子View的大小AT_MOST表示子View最大不能超过某个值。测量时子View的MeasureSpec是由父View的MeasureSpec和子View的LayoutParams共同决定的这个联动关系经常会作为选择题的选项出现。比如在ScrollView中嵌套RecyclerView时因为父容器是UNSPECIFIED模式RecyclerView的高度测量会变得不可控这也是为什么很多人会遇到“RecyclerView只显示一屏”的问题。关于View的绘制顺序有一个容易被忽略的细节在onDraw中做耗时操作会导致掉帧因为绘制流程是在主线程执行的。自Android 3.0起硬件加速默认开启但这并不意味着onDraw中可以随意做复杂计算。笔试如果问“如何优化自定义View的绘制”最标准的回答是避免在onDraw中创建对象、避免执行耗时逻辑、使用invalidate的脏区域刷新而不是直接调用invalidate全量重绘。2.4 性能优化与内存管理性能优化部分内存泄漏是最高频的考点。常见场景包括Handler持有Activity、静态变量持有Activity或View、单例持有Context、匿名内部类持有外部类引用、资源未关闭等等。笔试一般会让你列举哪些场景会导致内存泄漏或者给出一个代码片段让你找出问题。解决内存泄漏的工具也常考LeakCanary用于检测泄漏Android Studio自带的Profiler可以分析堆内存和CPU占用而JProfile这类工具虽然功能强大但校招生了解即可。ANR也是一个经典考点产生ANR的四种情况需要背清楚输入事件5秒内未处理完成、BroadcastReceiver的onReceive 10秒内未执行完、Service的onCreate等生命周期20秒内未完成以及前台Service 20秒内没处理完。这里有一个很容易踩的坑——很多人以为只在子线程里做耗时操作就够了但后台线程如果数量过多或者优先级设置不当同样会影响主线程的消息处理导致ANR。内存优化中SparseArray和ArrayMap取代HashMap的场景也经常出现在选择题里。它们比HashMap更省内存因为避免了HashMap的自动装箱和哈希表结构的开销。但要注意SparseArray只能用于key为int或long的场景如果key是String还是得用HashMap。顺便一提Android开发中推荐使用android.util.SparseArray而不是android.util.LongSparseArray前者API更早可用。3. 实战真题解析——从题干看考点3.1 经典选择题一个误区带出的知识盲区我举个例子这套试卷里有一道印象很深的题“以下哪个选项不会导致Activity内存泄漏”。选项分别是A. 静态变量持有Activity引用B. 非静态内部类Handler持有Activity引用C. Activity的onDestroy中未反注册BroadcastReceiverD. Activity中创建的线程在onDestroy后仍在运行。这道题的陷阱在于选项D。很多人觉得线程还在运行就一定会导致泄漏其实不一定。如果线程是静态的或者是全局单例它不持有Activity的强引用那就不算泄漏。但如果这个线程是一个以匿名内部类形式创建的它隐式持有外部Activity的引用那就会泄漏。所以严格来说D选项并不是“一定”会导致泄漏的选项。这道题考察的其实是对“强引用”这个概念的理解而不只是对泄漏场景的机械记忆。再说一道印象中与RecyclerView相关的选择题“关于RecyclerView下列说法正确的是”。正确的选项是“RecyclerView通过ViewHolder模式实现复用复用机制由RecyclerPool管理”。错误选项包括“Item添加动画一定会导致性能下降”“LayoutManager必须自定义才能实现横向列表”“RecyclerView嵌套在ScrollView中时高度可以自动测量”。这题考的是RecyclerView的基本认知和嵌套使用的坑。RecyclerView嵌套ScrollView时高度测量问题非常经典正确解法是重写LayoutManager的canScrollVertically返回false或者使用NestedScrollView替代ScrollView但这个方案本身的性能消耗比较大一般不建议直接套用。3.2 简答题的答题思路从结论到原理简答题部分典型题目有“简述Handler机制的原理”“如何解决ListView滑动卡顿的问题”“进程间通信有哪几种方式各自的应用场景是什么”。答题思路非常重要笔试的简答题阅卷通常按点给分你需要先写结论再写原理最后补充细节。以“Handler机制原理”为例我的回答方式是“Handler机制是Android中线程间通信的核心方案主要由Handler、Looper、MessageQueue和Message四个组件构成。Looper在目标线程中通过loop方法循环取消息Handler通过sendMessage方法将Message放入MessageQueue消息被Looper取出后回调Handler的handleMessage方法从而实现在目标线程中处理消息。主线程启动时系统创建了主Looper因此主线程中可以直接使用Handler子线程需要手动调用Looper.prepare和Looper.loop。”关于“进程间通信方式”需要列举Binder、Socket、共享文件、ContentProvider和Messenger。Binder是最常用的性能高且支持安全校验广泛用于系统服务和跨进程调用ContentProvider是系统层面的进程间数据共享标准Messenger基于Binder封装适合单线程消息传递共享文件适合简单数据同步但并发读取时存在一致性问题Socket适合跨设备或跨平台的通信但开销较大。答题时如果能提到“Binder底层基于内核的mmap机制实现一次拷贝”会让面试官觉得你确实理解过而不只是背了概念。3.3 手写算法题与代码规范编程题部分通常会考1至2道难度介于LeetCode的Easy和Medium之间。出现频率较高的题目包括“链表反转”“判断链表是否有环”“二叉树层序遍历”“两个线程交替打印1到100”“字符串中的第一个唯一字符”。这些题本身不偏不怪关键是在笔试中能否快速写对。以“两个线程交替打印1到100”为例这题考察的是线程协作和锁的使用。用synchronized wait/notify或者ReentrantLock Condition都可以实现。写法上需要注意两点第一两个线程共享一个对象锁打印后调用wait()释放锁第二需要设置标志位来决定当前该哪个线程打印防止虚假唤醒。很多人一紧张就忘了wait必须在synchronized代码块内调用或者忘了用try-catch包围InterruptedException这些都是阅卷时能一眼看出的规范问题。另一个容易被忽视的问题是边界条件。比如反转链表题目一般不会直接告诉你有几个节点但你写的代码需要正确处理空链表和单节点的情况。笔试题的测试用例通常包括空输入、最小值、最大值等边界情况代码里缺少边界判断会被扣除不少分数。我自己的习惯是主干逻辑写完后立刻补上兜底判断入参为null时返回什么输入长度为0时返回什么数字溢出时如何处理。4. 试卷失分点复盘与复习路线建议4.1 答题顺序与时间分配的实战经验我在模拟这套试卷时总结出的时间分配方案是选择题和判断题控制在30到40分钟这部分基本是概念题会就是会不会也不要死磕简答题控制在20到25分钟每题写个三四条要点就够了不用写成小论文编程题留30到40分钟先读清题目再动手写。很多人在笔试中最大的错误是在多选题上反复纠结。多选的计分规则是“少选不得分、错选不得分”因此不确定的选项宁可不选。比如一道题问“下列哪些属于Activity的启动模式”如果你只确定standard和singleTop那就不选singleTask和singleInstance即使最后漏选丢了分也好过错选直接归零。同理问“哪些情况会导致ANR”不确定的选项不要勾。另外一个实战细节编程题不要一上来就写最优解先写能跑通的暴力解法再逐步优化。很多线上笔试系统是按测试用例给分的一个不完整的“最优解”可能只通过60%的用例而暴力解反而能拿满基础分。优化到AC再回头精修代码是性价比最高的策略。4.2 结合项目的复习方法笔试的考点和项目实践是重叠的建议以项目作为复习的锚点而不是脱离项目去死磕八股文。比如项目中用到了Retrofit就顺藤摸瓜去复习OkHttp的拦截器原理用到了Glide加载图片就去搞清楚它的三级缓存和生命周期绑定机制用到了LiveData和ViewModel就把生命周期感知的原理搞明白。热词列表里频繁出现“android framework”“android ams”“android ota”说明现在很多公司对Framework层的要求在提高。校招笔试虽然不会直接考AMS的源码级别但掌握基本的系统服务调用链路是有必要的。比如“点击一次App图标从Launcher到Activity显示的完整流程”这类题目时常作为加分项出现。核心链路是Launcher通过Binder调用AMS的startActivity方法AMS经过进程调度和ActivityStack的管理后通过ApplicationThread回调到App进程中最终执行Activity的onCreate。能把这套流程讲清楚的候选人在面试中一定能让面试官眼前一亮。4.3 不需要死记硬背的知识点笔试虽然有大量记忆型题目但有一些内容我不建议花太多时间去背。比如具体的抽屉布局的控件属性、某个第三方库的最新版本号、Android Studio的快捷键这些内容在真实开发中都是随时可以查到的笔试考察的意义不大。热词列表里出现的“android studio怎么用ai”“android studio汉化”这类问题属于工具层面的操作不会出现在正式的笔试考卷中。但基础的数据结构和算法我强烈建议不要临时抱佛脚。大厂的笔试环节算法题的比重在逐年提升好的算法功底决定了你能否在有限时间内完成题目。面试前最好把LeetCode Hot 100里的题目刷一遍重点是数组、链表、二叉树、哈希表、栈和队列、动态规划这几类题型。不要只刷自己擅长的类型笔试出题者不会按照你的偏好出题。5. 面试准备与简历自查清单5.1 简历中的“熟悉”与“了解”要慎用笔试通过之后面试官通常会拿着你的简历逐个核对技术栈。简历上写“熟悉Handler机制”就要做好被追问Handler的源码细节的准备写“熟悉事件分发机制”就要能完整画出dispatchTouchEvent和onInterceptTouchEvent的调用链写“熟悉RecyclerView”就要能说出四级缓存分别是哪些、各自的作用范围是什么。简历上的每个词都应该是你真正掌握的否则面试官三连问就会露馅。对于Android岗位简历的编写原则是“项目经历用数据说话”。不要只写“负责开发资讯类App”而要写“负责资讯类App的首页Feed流模块基于RecyclerView实现多类型Item展示通过预加载和图片压缩将首屏加载时间从1200ms优化到600ms”。有数据、有技术、有成果比空泛的描述有说服力得多。5.2 高频面试题的延伸准备笔试通过后还会面临一轮技术面试很多面试题其实是笔试题的延伸和深化。比如笔试考了Handler和Looper的关系面试就可能让你手写一个简单的Handler模型笔试考了Activity四种启动模式的名词解释面试就可能出一道“在一个singleTask模式的Activity中从外部再次启动这个Activity它的onNewIntent会被回调此时生命周期怎么走”的场景题。这类延伸问题没法靠背诵解决需要真正理解原理。我的建议是在笔试复习过程中每掌握一个知识点就试着追问三个“为什么”。比如为什么ContentProvider的onCreate先于Application的onCreate执行为什么Binder只需要一次拷贝就能完成数据传递为什么Activity的onDestroy只调用一次但onPause可能调用多次带着这些问题去翻源码、看博客、做实验面试时自然就有了自己的理解。5.3 面试中的表达与节奏控制最后想提一点技术表达能力和代码能力同样重要。笔试的简答题是静态的面试则是动态的切磋面试官抛出一个问题后你不仅要给答案还要在回答中传递出自信与条理。建议养成“先说结论再展开原理最后补充场景”的表达习惯。举个例子面试官问“HashMap和Hashtable有什么区别”如果只回答“一个线程安全一个线程不安全”那就太单薄了。但如果你补充说“HashMap在JDK 7及以前会死循环JDK 8改成了尾插法解决了这个问题”面试官就会觉得你不仅看过相关文章还动手验证过。再比如“ARCore应用在Android端的兼容性问题”——能结合自己在项目中做过的机型适配来讲远比背诵文档里的兼容性列表更有感染力。6. 那些年笔试中容易踩的坑6.1 概念混淆类错误Android笔试中有一些概念极其相似很容易踩坑。比如“启动模式”和“任务栈”的关系很多人背了四种模式却说不清TaskAffinity的作用。singleTask配合TaskAffinity使用时会在指定任务栈中寻找是否已有实例这一点选择题经常考。再比如“内存溢出”和“内存泄漏”的关系。内存泄漏是指对象无法被GC回收持续累积最终导致内存溢出内存溢出是内存不够用可能由泄漏引起也可能是单次峰值占用过高。这个区别在简答题里经常被考察最好用自己的话把两者的因果关系讲清楚而不是直接背定义。还有“Serializable”和“Parcelable”的对比。Intent传递对象时两者都可用但Parcelable是为Android专门设计的性能更好是官方推荐方案。具体来说Parcelable的读写主要发生在内存中而Serializable基于IO流反射调用较多因此效率差距非常明显。笔试选择题经常会把两者放在一起考效率对比。6.2 框架层与应用层混用校招生常见的问题是把第三方框架的API当成Android本身的API比如把OkHttp的错误说成“Android网络请求报错”。笔试和面试中要养成区分“Android系统能力”和“第三方框架能力”的习惯。比如网络操作本身Android只提供HttpURLConnection和底层Socket能力OkHttp和Retrofit是第三方封装库图片加载同样如此Android原生没有Glide只有BitmapFactory和ImageDecoder。我在模拟这套试卷的时候发现很多选择题只要区分了“哪部分属于Framework、哪部分属于SDK、哪部分属于第三方框架”就能迅速排除一半的选项。这个意识建议大家从笔试前就开始刻意培养。6.3 只背结论不追根因最后这个坑我多说几句因为它影响的不只是笔试而是整个职业发展。很多人复习Android面试喜欢背题背“Activity启动模式有四种”“内存泄漏的常见场景有五种”“RecyclerView比ListView强在哪”背得滚瓜烂熟但一遇到变化性的问题就懵了。比如笔试中如果问你“在启动模式为singleTask的Activity A中连续两次通过Intent启动AonCreate会被执行几次”答案是一次后续启动只走onNewIntent。但如果问“如果A的taskAffinity与默认不同且启动Intent中包含FLAG_ACTIVITY_NEW_TASK标志会怎样”时很多人就会卡住。核心原因是只背了结论没有理解任务栈的调度逻辑。要解决这个问题最快的路径是看源码。Android的源码虽然庞大但启动流程、消息队列、View绘制这些核心路径是可以找到视频讲解和推荐文章逐行拆解的。结合自己的项目和调试工具把一个核心机制彻底搞清楚要比浮光掠影地了解十个知识点有用得多。7. 给不同阶段读者的具体建议7.1 对正在春招的校招生如果你现在正处于春招的冲刺阶段时间已经很紧了整个知识体系的复习策略需要按“价值密度”来排序。先把Handler、四大组件、自定义View、事件分发、性能优化这几块吃透这是面试官最常问也是最能拉分的部分。然后是Java基础和数据结构这是笔试的保底分。最后是网络、操作系统和设计模式这部分性价比相对低但也不能完全裸考。笔试前一定要做几套模拟卷。不用找机构和培训班的所谓“押题卷”——那些往往是二手资料更建议直接刷近几年的各个大厂校招真题。做完之后不要只对答案就完事每一道错题都要记录错因、对照原文知识、写一份自己的解析很多人的复习效率低就是因为错题从来没形成错题报告。错题的这个环节我建议至少留出两周时间。7.2 对工作一两年想换赛道的开发看起来这是针对校招的文章但如果你已经工作了一两年想跳槽去更大的平台这套试卷依然有参考价值。工作带来的项目经验在面试中占据重要位置但Android的基础知识同样会被考察。只是考察方式不再停留在概念上而会直接问“你在项目里怎么解决这个问题”。比如笔试考了内存泄漏面试就会追问“你们团队线上是怎么发现内存泄漏的如何定位”。如果你只能在简历上写“熟悉常见的性能优化方案”却拿不出真实的案例面试效果会大打折扣。我的建议是在准备跳槽前先把手头的项目翻一遍复盘自己做过的性能优化、架构演进和踩坑修复整理成一条条可以讲3分钟的完整故事。7.3 对Android新人的入门路线如果你是刚接触Android还不着急找工作那这份试卷给你最大的价值是一份清晰的“方向地图”。不需要现在去啃源码也不需要硬背那些选择题陷阱先按《第一行代码》的顺序把基础组件、常用控件、数据存储、网络请求这些内容学一遍然后找一个完整项目亲手从零写一遍。在写项目的过程中你会自然碰到很多“异常”情况——为什么异步加载图片时ListView滑动会卡顿为什么屏幕旋转后Activity数据丢了为什么深色背景上黑色文字看不清。把这些“为什么”都记下来再对应到相关知识点的复习中你的Android学习之路就走得非常扎实了。8. 从笔试到入职一份个人体会写了这么多最后说点掏心窝的话。这套京东2019春招Android开发类试卷表面上是一份校招笔试题实质上是一面镜子照出了你过去几年技术积累的深浅。笔试的每一道题都不会白做它们在筛选候选人的同时也在帮你理解这个行业需要什么样的能力。我在自己带实习生的过程中发现真正能通过校招笔试并留下来转正的往往不是学校背景最好的那一批而是那些愿意沉下心把原理搞明白的人。同样是背Handler有人只记住了使用方式有人在面试时会画出手绘的消息循环流程图后者的机会一定会更多。如果你现在正在刷题给自己定一个目标每天理解一个核心知识点而不是盲目地背十道题。把“为什么”想通了把“怎么做”的代码写顺了比任何押题都有效。希望这篇复盘能给你一些复习思路上的启发也欢迎在评论区聊聊你遇到的那些让人印象深刻的Android笔试题。