简历打水漂,真不是你学历低;往往是技术深度不达标,这份Android面筋赶紧收藏

40 阅读9分钟
  1. 态度、沟通和为人都很好

  2. 2年左右工作经验

  3. 名校、名企、高学历(加分项)

**由此可见,技术是面试结果的决定因素。**那么到底技术掌握到什么程度才能比较轻松地通过面试呢?说了那么多,好像和Android没有一点关系,下面就开始以Android为例来分析下面试过程所需的技术。

Android面试过程所需要掌握的技术

一场面试都有一个流程,拿Android面试来说,面试内容不可能全是Android问题,里面应该会有编程基础相关的问题。我对Android面试中的问题做了下分类,如下所示:

  • 数据结构和算法

  • Java

  • Android

  • 设计模式和架构

一般来说,一个Android应用开发岗位是不需要太强的数据结构和算法的,但是这并不意味着候选者可以完全不懂数据结构和算法,所以数据结构和算法大家还是要稍微了解下,由于它不是必须的,所以就算面试过程中回答的不好也没关系,只要后面的Java、Android相关的问题能够完美回答就好。

**接下来主要描述下面试过程中对Android技术的要求。**在我对Android的理解这篇文章中,我对Android的技术类别做了一下划分,如下所示:

对于大部分面试者来说,大家的目标岗位应该是中高级,

中级岗位(T4)需要掌握的知识点是:基本知识点、深入知识点;

高级岗位(T5)需要掌握的知识点是:基本知识点、深入知识点、基本知识点的细节和系统核心机制。

Android面试需要准备内容的大致划分:(括号内为重要程度,最多5颗星)

  • Android相关知识、Java相关知识、设计模式(5)

  • 算法、数据结构(5)

  • 如何写简历、如何面试(4)

  • 项目、比赛获奖(4)

  • 操作系统、网络、数据库(3)

细分:

以下细分内容,网络等计算机基础方面还不是很全面,持续更新中。

我会逐步更新各个知识点相关博客或资源,如果需要,建议关注。

Android

  • Context的理解

  • Activity生命周期、启动模式、IntentFilter匹配规则

  • IPC:Serialzable、Parcelable、Binder、Socket

  • View事件体系

  • View绘制流程

  • RemoteViews(不重要)

  • Drawable(不重要)

  • 动画、绘图

  • window、wm、wms

  • 四大组件启动、工作流程(Activity至少看一下,AMS)

  • 消息机制:looper、handler、MQ

  • 线程、线程池、多线程

  • bitmap加载、缓存:LRUCache、DiskLruCache、LinkHashMap

  • CrashHandler(一般)

  • multidex(一般)

  • Fragment、Service、SQLite、Webview

  • Android内存泄漏场景及解决方法

  • ANR的原因、解决方法

  • 开源库(一般要求看过源码,知道原理):Retrofit、RxAndroid、EventBus、Picasso(优点)、OKhttp3

  • 持续集成Jenkins(不重要)

  • 单元测试、测试用例(一般)

  • 插件化:Atlas、OSGI(一般)

Java

  • Java基础:比如接口和抽象类的区别等

  • Java内存管理:工作内存和主内存等

  • 垃圾回收:回收算法、如何判断对象可以回收、新生代老年代等

  • 并发

锁:sychronized、lock(CAS);volatile;并发集合:CopyOnWriteArrayList、ConcurrentHashMap、RemoteCallbackList(Android的IPC用到)、LinkedHashMap;

  • 集合

Map、Set、List

Queue、Stack

HashMap、HashTable、ConcurrentHashMap:实现原理,区别等

LinkedHashMap

设计模式(六大原则:SOLID + 迪米特)

  • 单例模式:获取各种service

  • 工厂方法:activity、service(onStart)

  • 责任链:Android事件分发

  • builder:dialog、Picasso

  • 观察者:listview更新、EventBus

  • 适配器:listview adapter

算法、数据结构

排序

  • 冒泡排序

  • 选择排序

  • 归并

  • 堆排序

  • 插入排序

  • 快速排序

  • 希尔排序

  • 桶排序

  • 基数排序

字符匹配:KMP算法

二分查找

二叉树遍历、翻转、重构;二叉查找树

红黑树

AVL树、哈夫曼树、B树(一般)

网络

基本是围绕OSI七层模型展开,首先是各层的功能、每层有哪些协议。

深入主要考察应用层和传输层:

应用层:

  • HTTP报文格式、头部有哪些字段

  • HTTP状态码

  • HTTP和HTTPS的区别

  • HTTPS中SSL/TLS加密的握手过程

  • HTTP一次连接的具体过程

  • GET、POST的区别

  • DNS解析过程

  • Cookie、Session原理

传输层:

  • TCP/IP四层模型(和OSI的层次对应关系)

  • TCP三次握手、四次握手的过程,状态变化和原因

  • TCP、UDP区别

  • TCP拥控、流控原理

  • Socket原理

操作系统、数据库

线程状态及其切换

线程、进程区别

(数据库重要程度相对低一些,正在整理中,后续会更新)

大家结合自己对Android的学习过程以及面试经验,在面试中遇到的问题是不是都是包含在上面的5个分类之中呢?对于1和5相信所有人都没有问题,但是对比2、3、4中的内容,大家是不是都能很好地Cover呢?换句话说,如果2、3、4中的内容大家都能很好地掌握,面试中的问题还能难倒我们吗?在前面的分析中提到,技术是觉得面试是否成功的关键因素,那么在面试前要做的就是把技术搞好,同时注意沟通和态度,这样的话通过面试岂不是很简单的事?

如何逐个突破Android面试中所需的技术

这里主要是指上面2、3和4这三个类别中的技术,说实话,这并不是一件很简单的事。

那么到底如何学习呢?

可以自己去网上找一些博客、书籍,进行各个知识点的突破,要有耐心,找到一个心仪的工作非一日之功。

首先要阅读源码,因为面试中的很多问题需要从源码中找答案。

其次要主动学习平时工作中遇不到的一些技术,由于项目的原因,我们不可能通过公司的项目来解除到Android中所有的重要技术,尤其是一些规模不大的项目来说,这个时候要主动去学习。也许有人要问:”我怎么知道哪些东西是需要主动学习的呢?“这的确是个问题,但是我在前面的分类中做了一些举例,大家可以先尝试学习下那些技术,它们都是很重要且时常在面试中出现的技术问题。

另外学习的过程中要注意积累,比如写博客、记笔记都是可以的,同时在Github上做开源也是不错的选择。

另外,为了更好更快地学习Android面试中所需的技术,大家可以先去阅读一下《Android开发艺术探索》,书中对前面的2、3和4类别中的技术细节做了详细深入的讲解,通过这本书可以达到立竿见影的效果。(而且这本书的内容也很适合面试)

下面我先提出几点重点,是面试官基本必问的问题,请一定要去了解!

  • 基础知识 – 四大组件(生命周期,使用场景,如何启动)

  • java基础 – 数据结构,线程,mvc框架

  • 通信 – 网络连接(HttpClient,HttpUrlConnetion),Socket

  • 数据持久化 – SQLite,SharedPreferences,ContentProvider

  • 性能优化 – 布局优化,内存优化,电量优化

  • 安全 – 数据加密,代码混淆,WebView/Js调用,https

UI– 动画

  • 其他 – JNI,AIDL,Handler,Intent等

开源框架 – Volley,Gilde,RxJava等(简历上写你会的,用过的)

  • 拓展 – Android6.0/7.0/8.0特性,kotlin语言,I/O大会

知识系统化

系统化其实就是当你把一整个相关的知识都看过看懂之后,进行总结和建立各模块之间关系的过程。

每个人大脑“操作系统”是由概念和概念之间的联系的过程。系统化一方面可以加深知识的记忆,另一方面提供了另一个角度去理解这些概念,加大了概念的深入程度。

建议多做记录、总结,多在各模块、各学科之间建立联系,抽取统一适用的知识和智慧。

一点建议:

  • 别老问寒冬不寒冬?你先问自己技术到位不到位?

  • 面试一家公司之前,尽可能的准备充分,上面所有的这些总结都会反馈给猎头,而恰恰同一个猎头推荐的候选人会在同一个问题上翻车!所以,如果是猎头推荐,多问下其他面试者的反馈,相信猎头们不会吝啬的。

  • 简历上的除非真精通,不然不要写精通,你写个了解熟悉,然后深入谈下去发现你好像特别熟悉,好感度会提高很多。

  • 简历上不会的千万不要写,除非你觉得你今天人品爆表,面试官这个一定不会问!

  • 简历上越熟悉越擅长的写在越前面。ok,面试官一般会从一个问题入手,衍生其他问题,越前面越有机会进入你自己熟悉的话题。(至少我是这样)!

  • 带上自己得意的作品!带上自己吃饭的家伙,自己项目的代码,你已经赢了一半了。(至少我之前面试就这么干,你要看什么功能?你要实现什么?有什么问题?我当你面解决这个问题。什么?你觉得我说得不对?来来来,咱们直接看源码,主动权在自己手里!)

  • 该有的礼貌要有,该低调还是要低调。这个是对极少数人的建议,你技术再好,一副老子天下第一的样子,那不好意思,请另谋高就。

  • 做好有自己的积累,github,博客文章,不仅仅能提升自己的写作能力,积累经验,也是面试过程中别人了解你的绝佳途径。

最后平时学习不知道怎么建立体系的,可以参考下我下面提供的面试复习路线:

面试系统复习路线参考

其实,对于学历普通也没有耀眼光环的人来说,进大厂就靠一条,那就是:技术实力。但是很多人在小厂待习惯了,总是用小厂的标准来衡量大厂的要求,屡次面试受挫,于是得出了一个结论:面试造飞机,入职拧螺丝钉。

接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用