面临退学,幡然醒悟

能考上武汉大学,从高考成绩来说,我不算是一个差生。但刚上大一的他因为没有及时适应缺少管束的学习环境,想着大学随便玩玩就可以了,于是自控力不强的我开始了逃课打游戏的放纵生活。前期越悠闲,后期就越痛苦。第一学期不仅挂了科,满分4.0的绩点也只拿了1.8。

这一情况引起了老师的关注,春节期间老师打电话到我的家中,告知这样的绩点继续持续下去的话,会有退学的风险。我的爸妈在元宵佳节那天亲自送我去车站返校补考,上车之后选了个靠窗的位置坐下,望着父母亲脸上岁月痕迹,突然感到很愧疚,也是时候我下定决心要做出改变!


回到学校第一件事就是把手机了的游戏全部卸载,全心投入学习当中,大二择方向时,我选择了计算机专业(因为我是独生子,想着程序员赚的多)。也许这就是命运最好的安排吧,在这里我遇到了一个充满友爱的大家庭、带着我一起学习的室友、给予我支持的辅导员和无限信任的导师。

为了不辜负大家的期待,我开始积极调整自己的状态。在大三的时候,取得了接近满分4.0的绩点。


一举斩获大厂offer!

因为我在学校做过几个项目,都是前后端都做,大三实习期间又深入做android、ios开发,所以我这次大四校招投的都是自己最擅长的android开发岗位,刚开始面试的时候很紧张,但经历了非常密集的面试,也先后面了各种大厂,慢慢的也就没那么紧张了,下面我会把我的面经分享出来,大多部分都是面试问到的真题。

百度

百度一面

一面问的问题大多是开放性问题,主要是看个人思路吧。
1、手撕依赖关系树扫描算法(期间提了不重复扫描、优化时间复杂度等要求)
2、简述如何实现未知长度的数组翻转?
3、简述内存泄漏,你处理过哪些内存泄漏?
4、以100ms/张的间隔时间播放100张图片,且每张图片需要400ms进行加载,如何设计?
5、如何在无序数组中快速找到最小值(手撕二分查找算法)
6、简述Android中的ANR,以及为什么会出现ANR?
7、简述Handler消息机制(深挖内部实现原理)

我是在线视频面试的,面完了面试官让我等一下,意思应该就是过了,等下一轮面试,让我不要走开
好多个问题 一面一小时半特别长

百度二面

1、手撕一个有序数组的二分查找
2、列举一个你在实际项目中所进行的性能优化(深挖具体细节)。
3、简述单例模式的实现方式,且单例模式有什么优缺点?
4、简述Java的异常处理机制
5、多线程间如何进行信息通信?
6、多线程如何保证线程安全?
7、简述线程池
8、简述HashMap实现机制,如何解决HashMap的线程安全问题?
9、TCP和UDP的区别,分别有哪些应用场景?
10、简述七层网络模型
11、简述Android点击事件的分发机制
12、画一个BLE APP的功能架构图

二面差不多经历了45分钟,面试官就说够了不需要再问了,我就知道应该是过了,就继续坐着等三面。

百度三面

1、是个boss面试我的,一上来就问我有没有了解过哪些开源框架,我先说,然后说的长轮询和轮询的区别,如果一直没消息,服务器一直hold住连接占用资源怎么解决的
2、让我自己做一个下载库,怎么实现,进度条要以什么形式发送出去
3、问我android开发时候有没用过什么框架或者什么设计模式,我好像就用过1种模式,就是MVP,问我(protocol)是怎么实现的,为什么要用这个模式
4、问我其中一个项目(IM即时通讯)是如何存用户连接的,如果是tcp/socket长连接,是如何管理连接的
5、问我平常app里面 用http经常不,tcp呢
6、问我有没有接触过openGL,对他什么理解
7、问我希望在哪个城市工作
8、问我经不经常用linux,平时开发用什么系统,linux异步和同步i/o是怎么实现的,实际上就是在问linux select 、poll等的原理

百度每次面试完都会问我有什么问题,都会尽量回答我,每个面试官态度都很nice,会经常笑一笑缓减一下我的紧张。二面面试官说百度是如果三面技术面都过了,会放到池里面,每个部门自己挑选,要的话该部门会自己联系我,如果没人要,也算挂了,也有可能会有多个部门都给我发offer,到时候就可以自己选择了。每个面试大概间隔40-50分钟,效率不错。

腾讯

腾讯一面(电话面试)

1、handler机制(非常详细,必须对源码很了解)
2、Android动画,属性动画流程
3、Binder机制
4、除了Binder还有什么可以用来通信
5、内存泄漏问题(Android内存泄漏和Java内存泄漏)
6、View的绘制流程,draw和onDraw的区别
7、项目里的并发编程是怎么实现的
8、讲讲AIDL
9、经典HashMap(扩容,方法,大小,线程安全等)
10、currentHashMap(扩容,方法,如何保证的线程安全,1.7和1.8的区别)
11、接口和抽象类
12、volatile底层原理(中间提到了JMM,然后又问JMM的问题)
13、JMM(刨根问底)
14、JVM内存回收,新生代又是以什么比例分的
15、进程和线程区别(经典)
16、进程间通信
17、为什么android不用传统的进程通信方式而使用binder呢?区别是什么?
18、如何调用操作系统方法?
19、如何陷入操作系统内核态?
20、换页算法

腾讯二面

数组向右移动k步,O(n)时间写完了,然后被告知要一次循环搞定。。。。
自我介
1、你觉得一面面完你有哪些不足呢?
2、一面面试官说你看过handler源码,那我问一下为什么next()阻塞调用的是native的方法而不是wait呢?
3、那native的阻塞是怎么实现的呢?你看过这部分源码吗?
4、不让你调用,你怎么实现阻塞的效果
5、除了handler你还有什么方法实现通信?
6、你有看过flutter源码吗?为什么flutter在某些方面运行效果更好?
7、flutter的底层原理是什么?
8、你是怎么实现flutter与原生通信的?原理是什么?
9、如何在不使用任何工具的情况下,找出内存泄漏的原因?
10、反问

总体来说,一面面的还是很基础的,但是二面真的被问的有点懵,以至于我回家看看我到底是报了校招还是社招。。。真的能看出来,大厂的面试官很喜欢问为什么,很多底层的机制问题。

腾讯三面

1、之前面试哪里答的不好,有什么补充的吗?
2、tcp三次握手,四次挥手,为什么?
3、tcp拥塞控制,流量控制
4、tcp滑动窗口
5、什么情况下会造成内存泄***r /> 6、如何实现一个延迟发送接口?
7、一亿个数,有重复,返回最大的10个
8、面试很突然,也照前两面短,求个offer吧!

CVTE

一面-基础面(50mins)

1、webview的优化,预加载,资源缓存,h5和Java交互,漏洞,API改动
2、模块化application实现,AndroidMenifest文件合并问题
3、模糊图片优化
4、activity启动模式
5、线程池
6、自定义view的流程,做过哪些复杂的view,怎么实现的
7、ListView的优化
8、分别介绍集合
9、哪些集合是安全的,HashMap的put原理,我讲了后面Java1.8之后做得改进
10、如何判断对象是否已死,GC算法
11、Java内存模型JMM
12、多线程通信,wait/notify
13、一道情景题:需要提供一个连续不断的文件,每个文件大概300k左右,用完就不要了,应该怎么设计呢?
14、滑动窗口,网络拥塞控制算法
15、讲OSI模型中的TCP/IP,三次握手,四次挥手
16、了解哪些设计模式?
17、举例讲了Context

二面-项目组长面(45mins)

1、手画你在学校开发的项目的框架图,然后讲讲,这个画得不是很好,导致后面讲的不清晰
2、你自定义view过哪些复杂的view呢?讲讲怎么实现的?有没有自定义过继承ViewGroup的复杂view
3、Gradle构建项目的过程,编译其他库的时候有碰到什么问题吗,Gradle插件版本号跟Gradle的关系是怎样的
4、插件化和组件化有了解吗?
5、MVP开发模式的P会出现接口冗余,这会你需要怎么优化呢?
6、APP的编译过程
7、谈谈你未来3-5年的规划
8、如何解决项目团队矛盾的问题
9、你觉得Android运用层学的比较难的哪块是什么?
10、有实现过什么比较复杂的动画效果吗?怎么实现的?
11、屏幕适配方案
12、Android虚拟机的优化
13、手画Android系统架构,你觉得还有哪些层次没有接触到的,Framework层学到了哪些东西,讲些各类服务
14、手撕代码

总结:一面基础面试比较稳,但是紧接着就开始二面感觉状态比较疲惫了,而且面试官气场很大,不断地再给你施加压力感,有些时候会走神,发挥得比较差,我都感觉快聊不下去,面完以为挂了,吃完饭之后突然收到通过信息,非常幸运二面通过,可能是手撕代码救了我

三面(40mins,有三个面试官)

1、轮流介绍下自己
2、给前两次面试打分
3、有没有面试过哪些公司了,有收到多少offer了,为什么
4、工作的薪资期望,地点和时长
5、家庭情况,爸妈性格怎么样,你觉得跟谁的比较像,家里人对工作有什么要求吗
6、有没有女朋友
7、你的梦想追求,未来规划
8、你的童年印象最自豪的一件事情
9、最近压力最大的是什么事情,如何调解?我回答高考第二大,找工作第一大
10、有了解过CVTE吗,为什么要来面试呢
11、如果你面试没有通过,你觉得是什么原因呢?
12、提问了面试官两个问题

美团

一面

1、tcp/ip协议,三次握手四次挥手why?如何保证数据可靠性?数据包没有到达如何保证到达?
2、Ddos攻击
3、 java域的关键字以及区别
4、 hashmap数据结构以及如何计算hashcode,以及地址冲突了怎么办?
5、手撕arraylist实现
6、泛型以及泛型擦除,编译时还是运行时,擦除之后是什么?(object)
7、content provider
8、https的uri以及过程
9、handler、looper、message关系,looper一直运行吗?如何唤醒?关闭屏幕的话handler还在吗?
10、anr是什么,原因,如何监控?
11、内存泄漏以及handler 中的内存泄漏

二面

1、数据库事务是什么?有什么关键字?索引类别?如何优化查询?
2、fragment和activity关系以及优点如何使用生命周期
3、hashmap数据结构和hashtable区别,如何实现hashmap线程安全
4、设计模式具体,以及单例模式的实现方式有哪些,手撕单例模式
5、activity生命周期
6、https流程以及如何加密,为什么不全部都用非对称加密,非对称加密和对称加密区别
7、数据包在tcp中如何传输,OSI七层模型四层模型,数据包在网络中如何传输?
8、有哪些数据结构?树有哪些树以及特征?树层次遍历和深度遍历怎么用?
9、有哪些排序算法有哪些查找算法
10、手撕快速排序
11、事件分发以及画图
12、自定义UI
13、图片有哪些类型,区别是什么?图片第三方库用过哪些?
14、自己的项目问题

三面

1、https函数
2、用过哪些第三方库android的,数据库的,网络的
3、区块链项目是什么,讲一讲[区块链是什么
4、了解哪些新技术(kotlin、flutter具体)
5、https流程
6、遇到难题是怎么去做的
7、遇到新项目是怎么做的
8、更偏向应用层还是底层
9、对android和ios看法
10、对android更偏向于做哪些
11、项目相关说了很多

四面(HR面)

1、倾向地点
2、为什么要做Android
3、拿到哪些offer
4、对公司要求
5、其他常规问题

字节跳动

一面

1、activity启动、生命周期、具体各种情况的生命周期(B透明A还是stop吗?A还可见吗?A-B-A的生命周期,为什么先pause再stop)
2、启动模式以及应用场景以及首页使用singleTask的问题、TaskAffinct作用、从栈中移除activity的时候是不是需要走完生命周期,为什么?
3、service是什么,做什么用,具体启动方式,如何控制service,binder有什么要求、AIDL
4、handler机制流程、looper中延迟消息谁来唤醒looper、ThreadLocal作用,使用场景,怎么用
5、自定义view绘制流程、事件分发、onclick各种情况、ontouchEvent和onTouchListener优先级
6、线程和进程区别、线程可以控制进程吗?进程可以控制线程吗
7、泛型擦除
8、反射中ClassLoader.loadClass和class.ForName区别
9、抽象类和接口区别,抽象类可以实现接口吗?
10、AsyncTask
11、下载文件多线程如何实现
12、如何实现断点续传
13、tcp/udp区别、平时用什么,为什么
14、hashmap数据结构、初始大小、如何计算hash,插入在头还是在尾巴,为什么?hash冲突怎么办
15、算法输入两个无序数组,找出不在数组B中的数组A

二面

1、项目一个一个过
2、如何适配屏幕
3、死锁的条件
4、栈和堆,为什么要分成栈和堆
5、七层网络协议,数据包从发出到接收的过程
6、https和http区别
7、https流程
8、http请求头
9、Get和post区别
10、如何用两个栈实现队列

  1. 算法在红白蓝球的乱序数组中,如何将颜色一样的放在一起,不可以新建数组。
三面

1、项目具体、混淆原理,混淆了什么,混淆作用
2、遇到最困难的事情、技术的事情
3、数组找出现次数超过一半的数,map方式、站岗方式、链表方式、排序方式以及其中的时间复杂度
4、手撕排序实现找出现次数最多
5、完全二叉树层数,递归方法、归纳推理法、数学推导法
6、hashmap以及其中的hashcode修改、equals修改
7、handler机制原理、post方式具体
8、linkedhashmap
9、用过哪些第三方库,原理是什么(okhttp)

阿里

阿里一面(22分钟)

自我介绍都没有做,上来就问印象最深的一个项目,根据项目中的知识点提问

1、项目中使用了哪些材料设计中的东西?
2、ListView和RecyclerView的区别?为什么使用RecyclerView,好在哪里?
3、ListView的优化
4、为什么使用CardView,好在哪里?
5、项目中如何做到后台监听的?(项目中BroadcastReceive和Service相关问题)
6、使用的是什么数据库?
7、项目中使用那么多开源框架,如何获取这些信息的?如何筛选决定要使用这些东西?
8、有没有看过开源的代码?
9、你有什么问题要问?

基本上就是这些,一面整体感觉不错,当天晚上七点半接到二面电话。

阿里二面(24分钟)

1、自我介绍,同时问了项目中的细小的问题;
2、项目中如何让service常驻后台?
3、Activity的生命周期,每个周期伴随着什么?
4、Activity的启动模式,四种方法?
5、广播注册的两种方式,区别,优先级?
6、问了Layout的优化的方法?
7、一个singleton如何实现线程的同步问题?
8、Java的垃圾回收机制,垃圾回收算法?
9、平时如何代码是如何练习的?
10、使用过那么多开源框架,有没有看过源代码?(答:结合解析看过Retrofit、Rxjava、Okhttp等)
11、你有什么问题要问?

二面问的比较基础,基本上也都答上来了。二面结束第二天的下午接到三面电话;

阿里三面(45分钟)

1、自我介绍,同时问了三个项目的大概情况,(对混合开发那个比较感兴趣,问了一下,其他的没有细问)
2、由于其中一个项目是负责人,所以问了一下项目的整个设计流程
3、又问了项目中service常驻的方法,(回答和二面一样,但是这次说的比较清晰)
4、有没有了解过Realm的底层数据库是什么?(没有了解过)
5、他问有没有读过开源的源码?(说了一下Retrofit和RxJava的内部主要实现,这一次也答的比上一次清楚多了)
6、又问了ListView的优化
7、网络中Http get和post的区别
8、使用哪种数据传输格式?答Json,问还有哪些?答Xml。还有哪些?答:不知道
9、怎么解析Json?(答的在线解析生成Java类,他表示很感兴趣)
10、怎么在非UI线程更改UI?(答handle、AsyncTask、RxJava,表示现在我基本不用handle,直接用RxJava。)
11、Handle的工作原理和工作过程?(同时还说了Handle会造成内存泄漏的问题)
12、有没有了解过跨进程通信;(瞬间心虚,只是简单说了一下远程service的创建和AIDL实现远程通信,这里需要感谢CSDN的郭大神)
13、问了多线程的并发(说了两种重入锁的实现)
14、又问使用synchronized关键字的时候底层调用的是哪种锁?(没有了解过不清楚)
15、问了一个JavaEE的新特性,这个不知道也没听清楚;
16、interface中定义的变量默认的类型是什么(不加任何修饰)?(说是default,他反问default,我说这是方法中变量中的类型,interface中应该也一样吧;后来查了一下才知道,这里是个坑,interface只能是public static final的常量)
17、父类的方法是public,子类重写后,改为protect,会不会报错?反过来呢?
18、算法:国际象棋8*8的格子,马走“日”字,设计算法计算马如果走完全部格子?(答的回溯法说了一下思路,后来查了基本差不多)
19、你有什么问题要问?

四面(Hr面:30分钟)

1.聊聊个人的职业规划
2.你最大的优点是什么?
3.你有哪些方面待改进?
4.简述你大学所做的事情
5.说说你大学里最遗憾的事情
如果你和舍友产生了矛盾,如何处理?

之前三面的面试官说第二天会有Hr联系我,结果等了一个小假期才等来,这个电话是在中午打来的,Hr面基本上是聊天,比较轻松,聊聊以前的实习经历,聊聊项目经历之类的。感觉还不错。

华为

一面 (60分钟+20笔试)

1、熟悉哪种语言
2、算法题最大公共前缀 。
3、如何学习一门语言
4、讲讲集合类(讲了List、Map等主要实现类,底层数据结构主要参数主要方法)
5、synchronized修饰代码块以及方法的区别;synchronized reentrantlock等重入锁以及readwritelock的区别?
6、基本数据类型为什么还有包装类
7、如何防止超卖
8、成就最大的项目(讲了实习负责整个算法的部署,以及找到新的框架)
9、了解的数据结构或者算法,以及在实际中的应用
10、进一步追问排序算法原理,何为稳定不稳定,快排是否稳定
11、问了下如何看待开发和测试之间的关系,测试的意义,开发是否需要进行测试的培训

二面 (5分钟+20分钟)

1、自我介绍
2、hashMap介绍下
3、数据库整体,如何优化(加索引)
4、然后没什么问题了 来做做题吧
5、Leetcode 1143 和1701 第一道很快做出来了,面试官让说下思路然后觉得没啥问题,问我要不要反问什么。(反问面试官评价和学习建议:没给评价,只说转开发没什么关系,保持学习就可以。)

三面(30+12分钟)

1、自我介绍
2、比赛经历
3、奖学金
4、挑一个最有成就感的经历(比赛或者社团)
5、社团,你学到什么,什么最有成就感
6、实习中的收获
7、对艰苦奋斗,长期艰苦奋斗怎么看

面试总结

学习建议
  • 多看源码 ,包括Java层的代码在JVM中的实现源码:如synchronized的实现源码,Android Framework的源码更好认识Android层的实现,Android开源库源码(OKHttp,Retrofit,RxJava,EventBus,Glide,Gson…,更好的学习优秀开源库源码,做到用的熟,懂原理);

  • 多问自己为什么,比如两个技术点优缺点分别在哪,各自的使用场景(如单例模式下饿汉与懒汉的优缺点,使用场景),这样才能更契合实际应用开发,针对不同场景使用不同技术点;

  • 及时复盘总结面试中遇到的问题 ,分为两方面,一是知道但不能深入的,这种需要继续多看多总结,另一种是没接触过的,这种可以先了解下,万一面试又遇到了,可以回答下了解到的,之后再去深入总结(毕竟时间有限,不可能面面俱到,只能不断学习总结);

学习资源分享

自己如果有想要去的大公司,一定要提升好自己,让自己的能力和素质与公司匹配的上,我也一直相信,机会永远是留给有准备的人。在春招面试前我也准备了很久,刷了很多大厂面试题 ,已经整理出来分享给大家,算是一个感恩回馈吧:

阿里、腾讯、华为、京东、美团、字节跳动、百度、超一线大厂中高级面试题
阿里、腾讯、华为、京东、美团、字节跳动、百度、超一线大厂中高级面试题

那么怎么学习才能更好的进大厂呢?

无他,就是靠自己的毅力以及决心。一天不行,一个月;一个月不行,一年;有决心的人,啥学历、或者资历,那些都是借口。

不过除了毅力和决心之外,其实学习还是有效率之差的

互联网时代,其实网上有很多免费学习资料,只要你用点心,也总能找到学习资料。但是,很多时候,效率很重要,网上纵有很多免费消息,但是一来花费你的时间,二来自己摸索也会踩不少坑,三是不够系统

对于一位开发者来说,基础知识决定了能走走多远,能做多好,甚至是决定了能挣多少,尤其一些大厂非常注重基础,基础是一切的根本,很多面试时候都是问基础知识,只不过问得比较深入,而不只是了解,如果没有事先准备,很容易被淘汰。整理了一部分知识点,方便大家复习及巩固知识:

Android:(详细答案解析,点击我的GitHub可以看到全部内容)

1.Activity

  • Activity的启动流程

  • onSaveInstanceState(),onRestoreInstanceState的掉用时机

  • activity的启动模式和使用场景

  • Activity A跳转Activity B,再按返回键,生命周期执行的顺序

  • 横竖屏切换,按home键,按返回键,锁屏与解锁屏幕,跳转透明Activity界面,启动一个 Theme 为 Dialog 的 Activity,弹出Dialog时Activity的生命周期

  • onStart 和 onResume、onPause 和 onStop 的区别

  • Activity之间传递数据的方式Intent是否有大小限制,如果传递的数据量偏大,有哪些方案

  • Activity的onNewIntent()方法什么时候会执行

  • 显示启动和隐式启动

  • scheme使用场景,协议格式,如何使用

  • ANR 的四种场景

  • onCreate和onRestoreInstance方法中恢复数据时的区别

  • activty间传递数据的方式

  • 跨App启动Activity的方式,注意事项

  • Activity任务栈是什么

  • 有哪些Activity常用的标记位Flags

  • Activity的数据是怎么保存的,进程被Kill后,保存的数据怎么恢复的

2.Service

  • service 的生命周期,两种启动方式的区别

  • Service启动流程

  • Service与Activity怎么实现通信

  • IntentService是什么,IntentService原理,应用场景及其与Service的区别

  • Service 的 onStartCommand 方法有几种返回值?各代表什么意思?

  • bindService和startService混合使用的生命周期以及怎么关闭

3.BroadcastReceiver

  • 广播的分类和使用场景

  • 广播的两种注册方式的区别

  • 广播发送和接收的原理

  • 本地广播和全局广播的区别

4.ContentProvider

  • 什么是ContentProvider及其使用

  • ContentProvider,ContentResolver,ContentObserver之间的关系

  • ContentProvider的实现原理

  • ContentProvider的优点

  • Uri 是什么

5.Handler

  • Handler的实现原理

  • 子线程中能不能直接new一个Handler,为什么主线程可以 主线程的Looper第一次调用loop方法,什么时候,哪个类

  • Handler导致的内存泄露原因及其解决方案

  • 一个线程可以有几个Handler,几个Looper,几个MessageQueue对象

  • Message对象创建的方式有哪些 & 区别? Message.obtain()怎么维护消息池的

  • Handler 有哪些发送消息的方法

  • Handler的post与sendMessage的区别和应用场景

  • handler postDealy后消息队列有什么变化,假设先 postDelay 10s, 再postDelay 1s, 怎么处理这2条消息

  • MessageQueue是什么数据结构

  • Handler怎么做到的一个线程对应一个Looper,如何保证只有一个MessageQueue,ThreadLocal在Handler机制中的作用

  • HandlerThread是什么 & 好处 &原理 & 使用场景

  • IdleHandler及其使用场景

  • 消息屏障,同步屏障机制

  • 子线程能不能更新UI

  • 为什么Android系统不建议子线程访问UI

  • Android中为什么主线程不会因为Looper.loop()里的死循环卡死 MessageQueue#next 在没有消息的时候会阻塞,如何恢复?

  • Handler消息机制中,一个looper是如何区分多个Handler的 当Activity有多个Handler的时候,怎么样区分当前消息由哪个Handler处理,处理message的时候怎么知道是去哪个callback处理的

  • Looper.quit/quitSafely的区别

  • 通过Handler如何实现线程的切换

  • Handler 如何与 Looper 关联的

  • Looper 如何与 Thread 关联的

  • Looper.loop()源码

  • MessageQueue的enqueueMessage()方法如何进行线程同步的

  • MessageQueue的next()方法内部原理

  • 子线程中是否可以用MainLooper去创建Handler,Looper和Handler是否一定处于一个线程

  • ANR和Handler的联系

6.View绘制

  • View绘制流程

  • MeasureSpec是什么

  • 子View创建MeasureSpec创建规则是什么

  • 自定义Viewwrap_content不起作用的原因

  • 在Activity中获取某个View的宽高有几种方法

  • 为什么onCreate获取不到View的宽高

  • View#post与Handler#post的区别

  • Android绘制和屏幕刷新机制原理

  • Choreography原理

  • 什么是双缓冲

  • 为什么使用SurfaceView

  • 什么是SurfaceView

  • View和SurfaceView的区别

  • SurfaceView为什么可以直接子线程绘制

  • SurfaceView、TextureView、SurfaceTexture、GLSurfaceView

  • getWidth()方法和getMeasureWidth()区别

  • invalidate() 和 postInvalidate() 的区别

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

  • LinearLayout、FrameLayout 和 RelativeLayout 哪个效率高

  • LinearLayout的绘制流程

  • 自定义 View 的流程和注意事项

  • 自定义View如何考虑机型适配

  • 自定义控件优化方案

  • invalidate怎么局部刷新

  • View加载流程(setContentView)

7.View事件分发

  • View事件分发机制

  • view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch方法 三者优先级

  • onTouch 和onTouchEvent 的区别

  • ACTION_CANCEL什么时候触发

  • 事件是先到DecorView还是先到Window

  • 点击事件被拦截,但是想传到下面的View,如何操作

  • 如何解决View的事件冲突

  • 在 ViewGroup 中的 onTouchEvent 中消费 ACTION_DOWN 事件,ACTION_UP事件是怎么传递

  • Activity ViewGroup和View都不消费ACTION_DOWN,那么ACTION_UP事件是怎么传递的

  • 同时对父 View 和子 View 设置点击方法,优先响应哪个

  • requestDisallowInterceptTouchEvent的调用时机

8.RecycleView

  • RecyclerView的多级缓存机制,每一级缓存具体作用是什么,分别在什么场景下会用到哪些缓存

  • RecyclerView的滑动回收复用机制

  • RecyclerView的刷新回收复用机制

  • RecyclerView 为什么要预布局

  • ListView 与 RecyclerView区别

  • RecyclerView性能优化

9.Viewpager&Fragment

  • Fragment的生命周期 & 结合Activity的生命周期

  • Activity和Fragment的通信方式, Fragment之间如何进行通信

  • 为什么使用Fragment.setArguments(Bundle)传递参数

  • FragmentPageAdapter和FragmentStatePageAdapter区别及使用场景

  • Fragment懒加载

  • ViewPager2与ViewPager区别

  • Fragment嵌套问题

10.WebView

  • 如何提高WebView加载速度

  • WebView与 js的交互

  • WebView的漏洞

  • JsBridge原理

11.动画

  • 动画的类型

  • 补间动画和属性动画的区别

  • ObjectAnimator,ValueAnimator及其区别

  • TimeInterpolator插值器,自定义插值器

  • TypeEvaluator估值器

12.Bitmap

  • Bitmap 内存占用的计算

  • getByteCount() & getAllocationByteCount()的区别

  • Bitmap的压缩方式

  • LruCache & DiskLruCache原理

  • 如何设计一个图片加载库

  • 有一张非常大的图片,如何去加载这张大图片

  • 如果把drawable-xxhdpi下的图片移动到drawable-xhdpi下,图片内存是如何变的。

  • 如果在hdpi、xxhdpi下放置了图片,加载的优先级。如果是400800,10801920,加载的优先级。

13.mvc&mvp&mvvm

  • MVC及其优缺点

  • MVP及其优缺点

  • MVVM及其优缺点

  • MVP如何管理Presenter的生命周期,何时取消网络请求

14.Binder

  • Android中进程和线程的关系,区别

  • 为何需要进行IPC,多进程通信可能会出现什么问题

  • Android中IPC方式有几种、各种方式优缺点

  • 为何新增Binder来作为主要的IPC方式

  • 什么是Binder

  • Binder的原理

  • Binder Driver 如何在内核空间中做到一次拷贝的?

  • 使用Binder进行数据传输的具体过程

  • Binder框架中ServiceManager的作用

  • 什么是AIDL

  • AIDL使用的步骤

  • AIDL支持哪些数据类型

  • AIDL的关键类,方法和工作流程

  • 如何优化多模块都使用AIDL的情况

  • 使用 Binder 传输数据的最大限制是多少,被占满后会导致什么问题

  • Binder 驱动加载过程中有哪些重要的步骤

  • 系统服务与bindService启动的服务的区别

  • Activity的bindService流程

  • 不通过AIDL,手动编码来实现Binder的通信

15.内存泄漏&内存溢出

  • 什么是OOM & 什么是内存泄漏以及原因

  • Thread是如何造成内存泄露的,如何解决?

  • Handler导致的内存泄露的原因以及如何解决

  • 如何加载Bitmap防止内存溢出

  • MVP中如何处理Presenter层以防止内存泄漏的

16.性能优化

  • 内存优化

  • 启动优化

  • 布局加载和绘制优化

  • 卡顿优化

  • 网络优化

17.Window&WindowManager

  • 什么是Window

  • 什么是WindowManager

  • 什么是ViewRootImpl

  • 什么是DecorView

  • Activity,View,Window三者之间的关系

  • DecorView什么时候被WindowManager添加到Window中

18.WMS

  • 什么是WMS

  • WMS是如何管理Window的

  • IWindowSession是什么,WindowSession的创建过程是怎样的

  • WindowToken是什么

  • WindowState是什么

  • Android窗口大概分为几种?分组原理是什么

  • Dialog的Context只能是Activity的Context,不能是Application的Context

  • App应用程序如何与SurfaceFlinger通信的 View 的绘制是如何把数据传递给 SurfaceFlinger 的

  • 共享内存的具体实现是什么

  • relayout是如何向SurfaceFlinger申请Surface

  • 什么是Surface

19.AMS

  • ActivityManagerService是什么?什么时候初始化的?有什么作用?

  • ActivityThread是什么?ApplicationThread是什么?他们的区别

  • Instrumentation是什么?和ActivityThread是什么关系?

  • ActivityManagerService和zygote进程通信是如何实现的

  • ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord

  • ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系

  • 手写实现简化版AMS

20.系统启动

  • android系统启动流程

  • SystemServer,ServiceManager,SystemServiceManager的关系

  • 孵化应用进程这种事为什么不交给SystemServer来做,而专门设计一个Zygote

  • Zygote的IPC通信机制为什么使用socket而不采用binder

21.App启动&打包&安装

  • 应用启动流程

  • apk组成和Android的打包流程

  • Android的签名机制,签名如何实现的,v2相比于v1签名机制的改变

  • APK的安装流程

22.序列化

  • 什么是序列化

  • 为什么需要使用序列化和反序列化

  • 序列化的有哪些好处

  • Serializable 和 Parcelable 的区别

  • 什么是serialVersionUID

  • 为什么还要显示指定serialVersionUID的值?

23.Art & Dalvik 及其区别

  • Art & Dalvik 及其区别

24.模块化&组件化

  • 什么是模块化

  • 什么是组件化

  • 组件化优点和方案

  • 组件独立调试

  • 组件间通信

  • Aplication动态加载

  • ARouter原理

25.热修复&插件化

  • 插件化的定义

  • 插件化的优势

  • 插件化框架对比

  • 插件化流程

  • 插件化类加载原理

  • 插件化资源加载原理

  • 插件化Activity加载原理

  • 热修复和插件化区别

  • 热修复原理

26.AOP

  • AOP是什么

  • AOP的优点

  • AOP的实现方式,APT,AspectJ,ASM,epic,hook

  • jectpack

  • Navigation

  • DataBinding

  • Viewmodel

  • livedata

  • liferecycle

28.开源框架

  • Okhttp源码流程,线程池

  • Okhttp拦截器,addInterceptor 和 addNetworkdInterceptor区别

  • Okhttp责任链模式

  • Okhttp缓存怎么处理

  • Okhttp连接池和socket复用

  • Glide怎么绑定生命周期

  • Glide缓存机制,内存缓存,磁盘缓存

  • Glide与Picasso的区别

  • LruCache原理

  • Retrofit源码流程,动态代理

  • LeakCanary弱引用,源码流程

  • Eventbus

  • Rxjava

Java:(详细答案解析,点击这里可以看到全部内容)

1.HashMap

  • HashMap原理

  • HashMap中put()如何实现的

  • HashMap中get()如何实现的

  • 为什么HashMap线程不安全

  • HashMap1.7和1.8有哪些区别

  • 解决hash冲突的时候,为什么用红黑树

  • 红黑树的效率高,为什么一开始不用红黑树存储

  • 不用红黑树,用二叉查找树可以不

  • 为什么阀值是8才转为红黑树

  • 为什么退化为链表的阈值是6

  • hash冲突有哪些解决办法

  • HashMap在什么条件下扩容

  • HashMap中hash函数怎么实现的,还有哪些hash函数的实现方式

  • 为什么不直接将hashcode作为哈希值去做取模,而是要先高16位异或低16位

  • 为什么扩容是2的次幂

  • 链表的查找的时间复杂度是多少

  • 红黑树

2.ArrayList

3.Jvm

  • Jvm的内存模型,每个里面都保存的什么

  • 类加载机制的几个阶段加载、验证、准备、解析、初始化、使用、卸载

  • 对象实例化时的顺序

  • 类加载器,双亲委派及其优势

  • 垃圾回收机制

4.多线程

  • Java中创建线程的方式,Callable,Runnable,Future,FutureTask

  • 线程的几种状态

  • 谈谈线程死锁,如何有效的避免线程死锁?

  • 如何实现多线程中的同步

  • synchronized和Lock的使用、区别,原理;

  • volatile,synchronized和volatile的区别?为何不用volatile替代synchronized?

  • 锁的分类,锁的几种状态,CAS原理

  • 为什么会有线程安全?如何保证线程安全

  • sleep()与wait()区别,run和start的区别,notify和notifyall区别,锁池,等待池

  • Java多线程通信

  • 为什么Java用线程池

  • Java中的线程池参数,共有几种

5.注解

  • 注解的分类和底层实现原理

  • 自定义注解

6.反射

  • 什么是反射

  • 反射机制的相关类

  • 反射中如何获取Class类的实例

  • 如何获取一个类的属性对象 & 构造器对象 & 方法对象

  • Class.getField和getDeclaredField的区别,getDeclaredMethod和getMethod的区别

  • 反射机制的优缺点

7.泛型

8.设计模式