以下为楼主在最近的 Android 开发(社招)面试中总结的 Android 基础知识点,已经拿到心仪的offer,回馈同学们,感谢其他大佬的分享。
Android中大厂面试都很重视基础知识的考察,面试前不仅要熟悉这些知识点,也要适当去背诵,保证面对面试官时能从容清晰地表述出来。强烈推荐《Android开发艺术探索》,校招社招都对我很有帮助;《Java并发编程实战》帮助理解多线程安全;《深入理解Java虚拟机》帮助理解JVM。理解了以下问题后,最好要用笔手写下来,帮助你组织语言,加深印象,帮助复习。
本文主要是整理了中高级Android需要会的(或者说面试被频繁问到的内容),主要作为参考大纲,之后会陆续更新每个详细部分,供大家参考,互相学习。
常规面试题
Android面试题
- ListView 如何缓存的?
- RecyclerView联系人列表如何实现A-Z快速定位
- 广播和EventBus的区别
- 主线程Looper循环为什么没有卡主线程?nativePollOnce
- SharedPreference的线程安全、进程安全,如何跨进程
- Android 中实现多线程: threads, Handler, AsyncTask, IntentService
- Android 中如何实现多进程
- 自定义View的过程:measure,layout,draw
- LayoutInflater#inflate 的 attrachToParent true 是什么意思
- theme 和 style 有什么区别,优先级
- 有哪些进程间通信方式
- View 的渲染过程
- Binder 的原理和优势
- AIDL 中的 oneway 有什么用,方向标签 in、out、inout 是什么意思
- Android 中有哪些动画,都说下
- Serializable 和 Parcelable 的区别
- 你知道哪些Layout,ConstraintLayout 的特点是什么
- 手机开发者选项有哪些,不保留活动是什么
- 基本的数据类型有哪些?
- String、StringBuilder、StringBuffer的区别?
- Fragment是什么,使用场景和生命周期
- 说一下Context和内存泄露
- 线程创建的方法?
- Activity的启动模式和适用场景?
- ViewPager用过吗?然后扯到了它和Fragment联合;
内存泄露和内存溢出说一下
(1)内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
(2)内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
内存溢出的原因及解决方法
(1)内存溢出原因:
①内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
②集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
③代码中存在死循环或循环产生过多重复的对象实体;
④使用的第三方软件中的BUG;
⑤启动参数内存值设定的过小
(2)内存溢出的解决方案:
①第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
②第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
③第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
垃圾回收机制说一下?
四大组件
- 当内存不足时Service被杀死了,如何重启这个Service
- Android系统杀进程时,是怎么考虑进程优先级的?
- Fragment 的 ViewModel 如何访问到 Activity 的 ViewModel 的数据
- Activity 4种启动模式说下,各种启动模式适合的应用场景
- Activity 任务栈从底到顶为 A-B-C,低内存杀死进程后,重新点击,显示哪个?这时如果C里面有Fragment是怎样恢复的?
- Activity如何传参给Fragment?为什么用setArgument传参,而不是使用带有参数的构造器?
- window、view 和 Activity 的关系
- Activity、Fragment 的各个生命周期依次说一下,各个生命周期里面适合做什么
- Activity 调用 finish 方法后怎么走到 onDestroy 的
图片
- Glide缓存特点
- Glide为我们做了哪些内存优化
- Glide如何加载 GIF
- ListView 图片错位的原因,解决方案
- bitmap如何处理大图,30M的大图如何防止OOM?
网络
- OKHttp 如何实现缓存
- OKHttp 的超时时间,有考虑DNS超时码
- OKHttp 线程池、连接池讲下
- OKHttp 的所有拦截器有哪些,请求失败了重试1、2次怎么做
- Retrofit实现机制
- Room注解如何在编译时生成类文件
- http 和 https 的区别,shakehand的过程说下
- 状态码400、401,3xx有哪些
- 网络劫持是什么,应该怎么做
- TCP三次握手,握手中的网络包各个标记位是多少,四次挥手说一下
- TCP 发送窗口是什么?
- 混合开发h5了解多少
- 浏览器窗口访问一个网址的过程
- POST 和 GET 有什么区别
优化
- 内存泄漏分析,LeakCanary的原理,泄漏对象是如何找到引用链的
- APK瘦身
- 启动优化
- 卡顿分析!!
- ANR分析!!
- 为什么布局文件中层级越多,性能可能差很多
- 你有哪些应用性能优化的经验必问
- ProGuard怎么写
Java
1、Java中==和equals和hashCode的区别
2、int与integer的区别
3、谈谈对java多态的理解
4、String、StringBuffer、StringBuilder区别
5、抽象类和接口区别
6、Serializable 和Parcelable 的区别
7、string 转换成 integer的方式及原理
8、哪些情况下的对象会被垃圾回收机制处理掉?
9、什么是强引用、软引用、弱引用以及虚引用?
10、什么是依赖注入?能说几个依赖注入的库么?
11、静态代理和动态代理的区别,什么场景使用?
12、Java的异常体系
13、JVM的回收算法是怎样的
14、说一下泛型原理,并举例说明
15、能说说HashMap常用操作的底层实现原理吗?
16、垃圾回收机制和调用 System.gc()的区别?
17、说一下你所了解的设计模式有哪些
18、说下java中的线程创建方式,线程池的工作原理。
Kotlin
- Kotlin协程为什么能以同步代码写出异步逻辑?
- suspend 函数的工作原理
- 在协程上定义了一个局部变量,为什么在其中的其他线程里的协程也能访问到?
- by 的两种场景,by Lazy 的实现
- object 单例的实现
算法
- 各种排序算法(冒泡、选择、快排、归并。。。)的时间复杂度,各种查找算法(顺序查找,二分查找。。。)的时间复杂度
- LRU 实现(146)参考LinkedHashMap实现的3个方法
- LFU 缓存(460) 同一频率使用LRU的NodeList,外面套一层{freq to NodeList},NodeList用双链表实现
- 两数相加(445)
- 找缺失的数字(268)注意相似题目里有中等
- 两个队列实现栈(225)
- 删除子文件夹(1233)
- 螺旋矩阵打印(54)
- 用生成随机数1-5(1,2,3,4,5)的方法,得到一个可以生成随机数(1-7)的方法
- 54张扑克牌,分成3堆,大小王出现在同一堆的概率(排列组合算数题)
Android第三方库源码
1、网络底层框架:OkHttp实现原理
2、OKhttp针对网络层有哪些优化?
3、网络请求缓存处理,okhttp如何处理网络缓存的?
4、从网络加载一个10M的图片,说下注意事项?
5、网络封装框架:Retrofit实现原理
6、响应式编程框架:RxJava实现原理
7、图片加载框架:Glide实现原理
8、Glide如何确定图片加载完毕?
9、Glide内存缓存如何控制大小?
10、加载bitmap过程(怎样保证不产生内存溢出)
11、Android中软引用与弱引用的应用场景。
12、LruCache原理
13、Fresco与Glide的对比:
14、Bitmap如何处理大图,如一张30M的大图,如何预防OOM?
15、事件总线框架EventBus实现原理
16、内存泄漏检测框架:LeakCanary实现原理
17、leakCannary中如何判断一个对象是否被回收?
18、依赖注入框架:ButterKnife实现原理
19、依赖全局管理框架:Dagger2实现原理
20、数据库框架:GreenDao实现原理
性能优化
这个主要结合你所做过的项目问,一般面试官会问你项目做过哪些方面的优化,常见的问法就是:
优化的思路是什么
用到了哪些技术
遇到了哪些困难(问题)
如何解决
有什么心得
主要结合自己项目回答。切记不要自己给自己挖坑,比如没有做过这方面优化,你为了表现自己,说做过,结果面试官往下问回答不出来,这关乎诚信问题,你们懂的~
抽象问题
- 讲讲做过的项目,有哪些亮点
- 你自己的亮点在哪里,你的加入可以给团队带来什么
- 技术规划,怎么发展
设计题
- 如果让你设计一个音乐播放器,要实现哪些接口
- 设计一个图片下载库:深挖 Glide,如果图片没有设置有效期,如何保证缓存被更新?
有关的一些面试题还有复习资料我都放在我的Codechinahttps://codechina.csdn.net/weixin_55362248/android/-/blob/master/Android.md有需要的可以自行查看。
下面统计一些公司的真实面试题
(一)泰科电子面经 高级安卓工程师社招面试题目
1.ContentProvider的权限管理(解答:读写分离,权限控制-精确到表级,URL控制)
2.如何通过广播拦截和abort一条短信?
3.广播是否可以请求网络?
4.广播引起anr的时间限制是多少?
5.计算一个view的嵌套层级
6.Activity栈
7.Android线程有没有上限?
8.线程池有没有上限?
9.ListView重用的是什么?
10.Android为什么引入Parcelable?
11.有没有尝试简化Parcelable的使用?
12.四大组件以及使用方式
13.网络请求
14.get/post请求的区别
15.xml/json的区别以及解析方式
16.谈谈对Handler的理解
17.service的启动方式
18.屏幕适配
19.ArrayList与LinkedList区别
20.Application和Activity的Context对象的区别
21.Android属性动画特性
22.如何导入外部数据库?
23.LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景。
24.谈谈对接口与回调的理解
25.回调的原理
26.写一个回调demo
27.介绍下SurfView
28.RecycleView的使用
29.动态权限适配方案,权限组的概念
30.Android系统为什么会设计ContentProvider?
31.下拉状态栏是不是影响activity的生命周期
32.说说ContentProvider、ContentResolver、ContentObserver之间的关系
33.请描述一下广播BroadcastReceiver的理解
34.广播的分类
35.序列化的作用,以及Android两种序列化的区别
36.Android中PID和UID的区别
37.Binder的理解,以及为什么要用Binder,进程间通信的方式
38.框架搭建选型的注意点
39.第三方SDK应用
40.MVC、MVP设计模式
41.TCP与UDP的区别
42.Dalvik虚拟机方面
43.EventBus实现原理
44.对自定义view的理解
45.详细介绍下自己做过的项目对你的成长最大?哪个的收获最大?
46.你认为一名安卓工程师最重要的特质是什么?你在工作中最终重视的因素是什么?你在工作中是怎么保持持续学习的?
(二)咻电科技 安卓工程师 社招 面试技术题目
1.mvc和mvp的使用场景和优缺点
2.Hashmap实现原理
3.性能优化(一定要具体说出很多方案,比如内存、电量、流量等具体解决方案)
4.单例模式的写法和各种写法的优缺点
5.okHttp、volley、retrofit等网络框架的使用和原理
6.四大图片加载框架的使用和原理
7.如何考虑架构设计
8.自定义View,绘制流程、步骤,
9.事件拦截和分发机制
10.进程间的通信方式
11.应用的创建启动流程
12.Handler是怎么导致内存泄露的
13.设计模式理解问得也多,
14.Binder驱动
15.如果在onStop的时候做了网络请求,onResume的时候怎么恢复?
16.Bitmap使用时候注意什么?
17.Bitmap的recycler()
18. Android中开启摄像头的主要步骤
19. ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
20. 点击事件被拦截,但是想传到下面的View,如何操作?
21. 微信主页面的实现方式
22.微信上消息小红点的原理
23.如何优化自定义View
24.低版本SDK如何实现高版本api?
25.描述一次网络请求的流程
26.HttpUrlConnection和okhttp关系
27.Bitmap对象的理解
28.looper架构
29.Activity上有Dialog的时候按Home键时的生命周期
30. 两个Activity之间跳转时必然会执行的是哪几个方法?
31.前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。
32. ActivityThread,AMS,WMS的工作原理
33.自定义View如何考虑机型适配
34.自定义View的事件
35.AstncTask+HttpClient与AsyncHttpClient有什么区别?
36事件分发中的onTouch和onTouchEvent有什么区别,又该如何使用?
(三)腾讯社招安卓岗面试经历(凉)
1、synchronize用法,volatile用法,两者的区别和场景
2、动态权限适配方案,权限组的概念
3、网络请求缓存处理,okhttp如何处理网络缓存的;图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM
4、进程保活
5、listview图片加载错乱的原理和解决方案,listview是如何做缓存的?
6、https相关,如何验证证书的合法性,https中哪里用了对称加密,哪里用了非对称加密,两者的区别?
7、Android系统为什么会设计ContentProvider,进程共享和线程安全问题
(1)提供一种跨进程数据共享的方式:
由系统来管理ContentProvider的创建、生命周期及访问的线程分配,简化我们在应用间共享数据(进程间通信)的方式。我们只管通过ContentResolver访问ContentProvider所提示的数据接口,而不需要担心它所在进程是启动还是未启动 。
(2)更好的数据访问权限管理:
ContentProvider可以对开发的数据进行权限设置,不同的URI可以对应不同的权限,只有符合权限要求的组件才能访问到ContentProvider的具体操作。
微信的聊天数据在本地都是加密处理的(防止root了被破解),设计一个类似的本地数据存储系统
8、jvm相关和GC回收算法的区别
9、Android相关优化(如内存优化、网络优化、布局优化、电量优化、业务优化)
10、EventBus实现原理和观察者模式在开发中的运用?
11、动态代理模式如何运用?
12、App是如何沙箱化,为什么要这么做?
(四)滴滴社招面试
一面
1、询问项目相关的问题;
2、概述一下****HashMap
答:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
3、hashmap原理说一下;
4、HashMap什么时候进行扩容呢?
答:当HashMap中的元素个数超过数组大小时,就会进行数组扩容。
5、https相关过程说一下;
6、线程安全。synchronized,lock各种原理
7、如何保证通信安全性?
8、如何实现链表数组?
二面
1、项目经历介绍;
2、content-type有哪些值?
3、常见的响应码有哪些?
(1)200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
(2)404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
(3)500:请求资源找到了,但服务器内部出现了错误;
(4)302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
4、UNICODE和utf-8是干什么的,一个中文分别在其中占据多少大小?
5、如何批量发布?
6、应用崩溃了怎么办,如何收集崩溃信息?
7、应用网络不好如何判断?
8、通信如何保证安全?
9、android缓存如何缓存,图片如何缓存,数据如何缓存,缓存机制?**
10、js和android耦合;
11、react native
12、kotlin以及看法;
13、flutter
14、算法题:洗牌不回到原来位置;
三面
1、线程锁的区别;
2、同一个锁为什么效率有差别?
3、多态和重载区别;
(1)多态是建立在重bai写的基础之上的,是类与类du之间的zhi关系,是发生在不同的类之dao间的,子类重写zhuan父类的方法。实现不同的子类,不同的实现形态。多态有3个条件:继承、重写和父类引用指向子类对象
(2)重载则是类的内部的方法构型上的不同,是发生在同一个类里面的。同一个函数名称,参数不同的多个方法,实现同一类型的功能。
4、Hashmap
5、Jni
6、设计模式:观察者模式怎么用?
7、说一下自身的优缺点;
8、你对领导期望是?
9、你对滴滴了解有多少?印象如何?说一下你的看法。
以上面试原题我都是从我的Codechina里面提取出来的,有需要的小伙伴可以直接去的Codechina查看。
项目地址:Codechinahttps://codechina.csdn.net/weixin_55362248/android/-/blob/master/Android.md
由于篇幅原因,在这里就不一一展示了,有需要的小伙伴可以点击上方链接直接获取。
小伙伴们记得一键三连哦!