Android 面试官精心整理:"五年面试经验

莎利亚
• 阅读 1549

作者:面试官

首先呢!做为一个面试官,这几年面过的中高级 Android 开发工程师已经突破了上百人,Failed 的不敢说,但是 Pass 掉的基本是没有看走眼的;

眼看年后春招即将来袭,特此赶在年轻整理完毕,谈谈我对 Android 中高级面试的一些看法和体会。

如果,你有更好的看法,希望能在评论区留言,我们一起讨论。

Android 面试官精心整理:

一般来说,大部分面试官在面试所耗用的时间都不是固定的,以我平均的面试时间做个标准的话,基本上是在 45 分钟之间,如果碰到比较优秀的 Android 面试者可能会延长面试的时间。

但是如果是我主动延长面试时间的话,那么首先要恭喜这位朋友了我是对他感兴趣的,不出意外的话,基本上这位朋友应该是稳了。

因为面试本来就是一个输入和输出的过程,面试官主要的职责是要引导面试者在短时间展现他最强的实力,如果一位面试官连这点都做不好,我敢断定这决对不是一位合格的面试官。

那对于面试官,该如何完成一次高效的 Android 面试呢?

面试前的准备

1.简历调查

简历到你手上的时候,你要做好充分的调查分析,不仅仅是对公司负责,也是对自己与候选人时间的尊重,明显不“对劲”的简历,就不要抱着“要不喊过来试试看”的想法了,候选人也许很不错,但如果跟你的岗位不匹配,也不要浪费大家时间,你要想清楚现在需要的人是有潜力可以培养的,还是亟需帮忙干活的。另外如果简历里附带了博客链接,GitHub地址, 相关作品的,可以提前去看看,直接看人家多年积累的文章与代码,比这短短一小时的面试来得靠谱的多。

2.准备面试题

了解清楚候选人背景后,要根据简历,有针对性的准备问题,可以是他作品或做过项目里的某个技术细节的实现方式,也可以是他声称精通的某些领域的相关问题。总之不要等到面试过程中现想问题,特别是刚开始面试别人的同学,往往经验不足稍带紧张导致大脑短路,其实也是很尴尬的,把要问的问题提前写下来,准备充分。

身为面试官,你应该考察几个点?

1.简历是否真实

这其实是面试第一要务, 面试的过程其实就是看简历是否属实的过程,因为能到面试环节,说明这个人是符合要求的,不满足要求的早就被剔除了,如果他真的如简历描述的那样,100%会招过来,如果人人都如此,那就不需要有面试这种过程了。

需要注意的是这里的真实有三层含义:

  • 是他如实描述了自身经历,很多人只在一些大项目里做一个很小的螺丝钉,但简历里往往夸张这段经历。

  • 二是不知道自己不知道,常见于简历里各种“精通”开头的描述,因为知识体系与视野的局限,明明只是了解很浅却夸口精通,很多时候他并不认为自己说的有问题,而是真的以为自己已然精通,有点井底之蛙的感觉。

  • 三是简历里的真实要与你的期望相匹配,一门技术了解到怎样的程度才算精通,很难有定论,所以这里的“真实" 只能是候选人与面试官标准之间的契合,这种有主观运气成分,也许面试官水平不够错误判断了你,也不用感到不爽,面试何尝不是种双向选择呢。

2.技术的深度

技术的深度一向是我最看重的部分,当今任何一个技术领域都非常宽广,一个人要同时掌握那么多知识并且都深入几乎不可能,那都需要拼学习效率与工作年限了。而你曾经做过的东西,正在做的东西,是绝对可以了解得更深入的,一个对技术有好奇心,有技术热情的人,都不会仅仅停留在这个东西挺好用,而是会忍不住去探究它背后的技术原理,即便不是亲自去看源码,也会花点时间了解别人整理过的经验,所以单凭考察技术上的深度,就可以考察-个人是否对技术有热情 ,是否有技术好奇心等等这些很多大牛认为的所谓“优秀程序员的特征”。

之前曾看到过一句话:“一个人对他所做的事情了解得越深,他就能做的越好”。放在这里再合适不过了。

3.技术的广度

深度是有了,还需要广度吗?我个人的理解是:深度是必要条件,广度是加分项。同样的有技术好奇心的优秀程序员,也不会满足于仅仅局限于自己的一亩三分地,工作之余,也会想要尝试一些其它的领域和方向,因为投入问题也许不够深入,但很多领域知识你知道与不知道,对你个人知识体系的形成关系很大。

比如你要实现一个功能, 在你当前熟悉的技术领域上很困难或者效果不佳,在你就要放弃时你的同事告诉你,这用一个简单Sqi语句就可以实现啦,为什么要搞得那么麻烦?这个例子虽然举得很蹩脚,但是我想意思大家应该已经明白了。知识越有厂度,头脑里的技术体系就越备,同样的问题,你就可以想到N个解,思考一下就得出最优解了 。

如果你听都没听过一些东西,就会经常说出“这个好难搞啊”、"这根本就不可能”其实有的时候真是知识的局限问题,所谓的从0到1难,也是这个意思。

4.逻辑思维能力

这也是我比较看重的一点,这里并不是指那些臭名昭彰的脑经急转弯问题,而是通过交流观察,判断一个人表达观点逻辑是否清晰,回答问题是否有章法,这个很难描述,但如果你细心观察,你会发现很容易通过一些简单的交流,就可以看出一一个人是否逻辑清晰。

有时候你会觉得某个人表达沟通很不错,其实不是沟通的问题,是他说出去的话,经过了他大脑的条理清晰的整理,让你很容易就能明白。这种习惯不是一朝一夕就能养成的,所以面试过程中这点装不出来。

另外一个人如果逻辑清晰,而且反应又敏捷,语速很快,那是大大的加分项,恭喜你,碰到一个聪明人了。

Android 面试官精心整理:

那对于面试者,面试官通常会问哪些深度与广度并存的 Android 面试题呢?

因简书平台的推荐机制,这里只列举我曾经面过的几类很经典的 Android 面试题,不过我已经把这些年来收集所有大厂的 Android 中高级面试题整理成核心知识上传至我的【Github】

如有面试需要的朋友,可以点击“【Github】”参考复习

第一章 Android组件

  • 1. Activity的4大启动模式,与开发中需要注意的问题,如onNewIntent() 的调用;

  • 2. Activity A跳转B,B跳转C,A不能直接跳转到C,A如何传递消息给C?(美团)

  • 3. Activity如何保存状态的?

  • 4. 请描诉Activity的启动流程,从点击图标开始。(B站)

  • 5. APP是怎么启动的?

  • 6. 启动一个Activity的流程分析

  • 7. Service的生命周期是什么样的?Service两种生命周期以及区别

  • 8. 你会在什么情况下使用Service?

  • 9. startServer和bindServier的区别?(美团)

  • 10. Service和Thread的区别?

  • 11. IntentService与Service的区别?

  • 12. ContentProvider如何自定义与使用场景是什么?

  • 13. BroadcastReciver的静态注册与动态注册的区别?

  • 14. 广播的分类与工作原理

  • 15. 可以再onReceive中开启线程么,会有什么问题?

  • 16. 什么是有序广播?

  • 17. Application、Activity、Service中context的区别?能否启动一个activity、dialog?

  • 18. Fragment的生命周期? (美团)

  • 19. Fragment的构造函数为啥不让传参?(B站)

  • 20. Fragment add与replace的区别,分别对Fragment的生命周期影响(美团)

第二章 View System

  • 1. View绘制流程与自定义View注意点。(东方头条、美团)

Android中的每一个UI控件都是集成自View,然后这些View都具有相同的绘制流程,必须经过measure,layout和draw. view的绘制流程是在Window添加过程中,ViewRootImpl类的setView方法开始的

  • 2. 在onResume中可以测量宽高么

  • 3. 事件分发机制是什么过程?(东方头条)

  • 4. 事件冲突怎么解决?(东方头条)

  • 5. View分发反向制约的方法?(字节跳动)

  • 6. 自定义Behavior,NestScroll,NestChild。(东方头条)

  • 7. View.inflater过程与异步inflater(东方头条)

  • 8. inflater为什么比自定义View慢?(东方头条)

  • 9. onTouchListener onTouchEvent onClick的执行顺序。(58 京东)

  • 10. 怎么拦截事件 onTouchEvent如果返回false onClick还会执行么?(58 京东)

  • 11. 事件的分发机制,责任链模式的优缺点 (美团)

  • 12. 动画的分类以及区别(车和家)

  • 13. 属性动画与普通的动画有什么区别?(车和家)

  • 14. 插值器 估值器的区别(车和家)

  • 15. RecyclerView与ListView的对比,缓存策略,优缺点。(美团)

  • 16. WebView如何做资源缓存?(字节跳动)

  • 17. WebView和JS交互的几种方式与拦截方法。(字节跳动)

  • 18. 自定义view与viewgroup的区别

  • 19. View的绘制原理

  • 20. View中onTouch,onTouchEvent和onClick的执行顺序

  • 21. View的滑动方式

  • 22. invalidate() 和 postInvalicate() 区别

  • 23. View的绘制流程是从Activity的哪个生命周期方法开始执行的

  • 24. Activity,Window,View三者的联系和区别

  • 25. 如何实现Activity窗口快速变暗

  • 26. ListView卡顿的原因以及优化策略

  • 27. ViewHolder为什么要被声明成静态内部类

  • 28. Android中的动画有哪些? 动画占用大量内存,如何优化

  • 29. 自定义View执行invalidate()方法,为什么有时候不会回调onDraw()

  • 30. DecorView, ViewRootImpl,View之间的关系,ViewGroup.add()会多添加一个ViewrootImpl吗

  • 31. 如何通过WindowManager添加Window(代码实现)?

  • 32. 为什么Dialog不能用Application的Context?

  • 33. WindowMangerService中token到底是什么?有什么区别

  • 34. RecyclerView是什么?如何使用?如何返回不一样的Item

  • 35. RecyclerView的回收复用机制

  • 36. 如何给ListView & RecyclerView加上拉刷新 & 下拉加载更多机制

  • 37. 如何对ListView & RecycleView进行局部刷新的?

  • 38. ScrollView下嵌套一个RecycleView通常会出现什么问题?

  • 39. 一个ListView或者一个RecyclerView在显示新闻数据的时候,出现图片错位,可能的原因有哪些 & 如何解决?

  • 40. Requestlayout,onlayout,onDraw,DrawChild区别与联系

  • 41. 如何优化自定义View

  • 42. Android属性动画实现原理,补间动画实现原理

第三章 Android FrameWork

1. Android中多进程通信的方式有哪些? 进程通信你用过哪些?原理是什么?(字节跳动、小米)

2. 描述下Binder机制原理?(东方头条)

3. Binder线程池的工作过程是什么样?(东方头条)

4. Handler怎么进行线程通信,原理是什么?(东方头条)

5. Handler如果没有消息处理是阻塞的还是非阻塞的?(字节跳动、小米)

6. handler.post(Runnable) runnable是如何执行的?(字节跳动、小米)

7. handler的Callback和handlemessage都存在,但callback返回true handleMessage还会执行么?(字节跳动、小米)

8. Handler的sendMessage和postDelay的区别?(字节跳动)

9. IdleHandler是什么?怎么使用,能解决什么问题?

10. 为什么Looper.loop不阻塞主线程?Looper无限循环为啥没有ANR(B站)

11. Looper如何在子线程中创建?(字节跳动、小米)

12. Looper、handler、线程间的关系。例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米)

13. 如何更新UI,为什么子线程不能更新UI?(美团)

14. ThreadLocal的原理,以及在Looper是如何应用的?(字节跳动、小米)

15. Android 有哪些存储数据的方式?

16. SharedPreference原理,commit与apply的区别是什么?使用时需要有哪些注意?

17. 如何判断一个 APP 在前台还是后台?

18. 如何做应用保活?

19. 一张图片100x100在内存中的大小?(字节跳动)

20. Intent的原理,作用,可以传递哪些类型的参数?

21. 如果需要在Activity间传递大量的数据怎么办?

22. 打开多个页面,如何实现一键退出?

23. LiveData的生命周期如何监听的?(B站)

第四章 性能优化

1. 内存优化,内存抖动和内存泄漏。 什么时候会发生内存泄漏?举几个例子(美团)

2. Bitmap压缩,质量100%与90%的区别?(东方头条)

3. TraceView的使用,查找CPU占用(东方头条)

4. 内存泄漏查找 (酷我音乐)

5. ANR是什么,怎么解决?ANR查找(美团)

6. CPU波动

7. 当前项目中是如何进行性能优化分析的

8. 冷启动、热启动的概念(酷我音乐)

9. View层次过深怎么优化,选择哪个布局比较好?(美团)

10. 怎样检测函数执行是否卡顿 (字节跳动)

第五章 开源框架

1. LeakCanray 2.0为啥不需要在application里调install?(B站)

2. OkHttp的原理(B站)

3. Glide缓存机制(B站)

4. Android如何发起网络请求,有用过相关框架码?OkHttp框架解决了你什么问题?(美团)

第六章 NDK

1.Jni了解吗?有没有自己使用过,只要编译成功Hello World也算,与JAVA相比效率如何?(美团)

2.C++中引用和指针的区别。

总结

说了这么多,但是最重要的还是那句话,面试跳槽加薪虽然是我们每个人都所期待的,但是你也要有与之相对的能力,如果你没有,千万别浪费了我们两个人宝贵的时间,望谨记;

为了能够帮助到大家更有效快速的切换至学习的状态,少踩点坑,我把我之前学习的一些Android 知识点笔记等进行了整理上传至GitHub项目地址中:https://github.com/733gh/Android-T3,大家想了解更多Android知识点的话可以自行查阅。

Android 面试官精心整理:

本文转自 https://www.jianshu.com/p/c44c8ca37ad5,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这