Android面试题集(来自网络整理)
一、几点建议
- 简历要如实写,相关的知识点一定要烂熟于心。
- 基础扎实,android和java相关的知识树网上有很多资料,看过但让你讲出来未必能说的好。
- 提前总结,你还擅长什么其他技术?这种开放问题要看知识面了。
- 学会提问,你有什么问题要问我吗?这种礼貌性问题也是一个了解对方的好机会。
- 良好的心里素质,无论遇到什么情况,面试官迟到、面试官态度冰冷说话不客气、质疑你的回答等等各种问题都不要慌也不要排斥,一定要沉住气,耐心积极的思考并回答对方的提问。
- 推荐几本书,也是好几次面试后发现里面涵盖了大部分答案。《Android开发艺术探索》《Android源码设计模式-解析与实战》《Android进阶之光》《深入理解Java虚拟机》,《Android音视频开发》多看几遍。
二、HashMap相关
包含知识点:散列表,散列冲突,散列均衡,散列扩充,哈希算法,哈希算法怎么应用在散列表上,负载因子;jdk1.8后HashMap引入了红黑树
- HashMap源码,SpareArray原理
- HashMap实现原理,ConcurrentHashMap的实现原理,原子类
- jdk1.5?SparseArray和ArrayMap各自的数据结构,前者的查找是怎么实现的,与HashMap的区别
- HashMap是如何解决Hash冲突的?
- HashMap和HashTable区别?
- Android对HashMap做了优化后推出的新的容器类是什么?比如使用SparseArray和ArrayMap
- HashSet和HashMap怎么判断集合元素重复
- LruCache底层实现原理
- ArrayList,LinkedList源码要看
三、哈希、加密相关
- MD5是加密方法么?Base64呢
四、架构、框架
- MVC,MVP,MVVM分别是什么?
- 项目组件化的理解
- app的架构是怎么样的,并且为什么这样,有什么优缺点?
- MVP、MVVM、MVC解释和实践
- Jetpack
- app的架构是怎么样的,并且为什么这样,有什么优缺点?
- MVP、MVVM、MVC解释和实践
- 如果用了一些解耦的策略,怎么管理生命周期的?
- 有用什么模式么,逻辑什么的都在Activity层?怎么分离的
- MVC,MVP,MVVM分别是什么?
五、UI
- 讲解Activity和Window,View的关系,以及DecorView结构
- 计算一个view的嵌套层级
- 封装view的时候怎么知道view的大小(ps:可能是宽高?)
- 自定义View如何考虑机型适配
- view渲染
- 自定义View里面OnMeasure参数的意义
- 自定义View,ViewGroup注意哪些回调?
- View绘制熟悉么,介绍下,能说下实现原理么
- Canvas的底层机制,绘制框架,硬件加速是什么原理,canvas lock的缓冲区是怎么回事
- surfaceview, suface,surfacetexure等相关的,以及底层原理
- View 事件传递机制
- down、move、up事件的传递
- 事件的传递方式,View,ViewGroup
- ACTION_CANCEL什么时候触发,触摸button然后滑动到外部抬起会触发点击事件吗,再滑动回去抬起会么
- 怎么处理嵌套View的滑动冲突问题
- Scroller有什么方法,怎么使用的。
- TextView调用setText方法的内部执行流程。
- RecyclerView 和Listview的区别,性能
- CoordinatorLayout、CollapsingToolbarLayout原理以及使用
- 介绍下SurfView
六、图片
- 图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM
- listview图片加载错乱的原理和解决方案
- 图片加载原理
- 基于自身工作经验和计算机相关知识,给出 移动端地图局部加载 瓦片大小的像素大小估值
- 图片加载三级缓存,有一个功能,做一个能放大缩小的图片查看器,加载一张巨大的图片,怎么做
- 图片加载框架优劣比较,以及之前项目选用加载框架时候的考虑
- glide缓存策略?同一个图片跟size有关么?
七、网络
- 网络请求缓存处理,okhttp如何处理网络缓存
- https相关,如何验证证书的合法性,https中哪里用到了对称加密,哪里用来非对称加密,对加密算法(如RSA)等是否有了解
- 视频加密传输
- https请求慢的解决办法,DNS,携带数据,直接访问IP
- TCP与UDP区别与应用(三次握手和四次挥手)涉及到部分细节(如client如何确定自己发送的消息被server收到) HTTP相关 提到过Websocket 问了WebSocket相关以及与socket的区别
- 网络请求相关,主要是网络请求优化。网络请求的时候遇到的问题
- 网络请求的开源框架:OKHttp介绍,写过拦截器么
- 数据层有统一的管理么,数据缓存是怎么做的,http请求等有提供统一管理么?
- HttpClient和HttpConnection的区别
- Https是怎么回事?
- Android长连接,怎么处理心跳机制。
八、Android基础
8.1 启动流程
- 答题说清一个应用程序安装到手机时发生了什么
- App是如何沙箱化,为什么要这么做
- 权限管理系统(底层的权限是如何进行grant的)
- App启动流程,从点击桌面开始
- 系统启动流程Zygote进程 ->SystemServer进程 ->各种系统服务 ->应用进程
- Manifests原理,APP启动流程,APK打包流程
- FW(Framework) 层熟悉么,源码看过么
- 介绍下app架构和通信
8.2 四大组件
- 画出Android的大体架构图
- BroadcastReceiver,LocalBroadcastReceiver区别
- 广播(动态注册和静态注册的区别,有序广播和标准广播)
- 怎么启动service,service和activity怎么进行数据交互
- Service基础概念,生命周期,通信。四大组件是基础,常见问题都要掌握
- service用过么,基本调用方法
- IntentService生命周期是怎样的,使用场合等
- activity栈
- intent-filter
- 下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,onResume的时候怎么恢复
- Activity的四种启动模式以及相关概念,Activity栈,常见情境下的生命周期分析,异常关闭页面之后的恢复
- Activity的生命周期,finish调用后其他生命周期还会走么
- ActivityA跳转ActivityB然后B按back返回A,各自的生命周期顺序,A与B均不透明。
- Activity的生命周期有哪些,知道onRestart么,介绍下
- Activity的启动模式有哪些?栈里A-B-C,先想直接到A,BC都清理掉,有几种方法可以做到?这几种方法产生的结果是有几个A的实例?
- 都熟悉哪些命令?知道怎么用命令启动一个Activity么?
- 非UI线程可以更新UI吗?
- 有什么工具可以看到Activity栈信息么?多个栈的话,有方法分别得到各个栈的Activity列表么
8.3 控件
- 想改变listview的高度,怎么做
- RecyclerView和ListView有什么区别?局部刷新?前者使用时多重type场景下怎么避免滑动卡顿。懒加载怎么实现,怎么优化滑动体验。
- SurfaceView和View的最本质的区别?
- 如何实现右滑finish activity?
- 如何在整个系统层面实现界面的圆角效果。(即所有的APP打开界面都会是圆角)
- LinearLyout、FrameLayout、RelativeLayout性能对比,为什么
8.4 存储
- android文件存储,各版本存储位置的权限控制的演进,外部存储,内部存储
- Android中的存储类型
- android文件存储,各版本存储位置的权限控制的演进,外部存储,内部存储
8.5 Fagment及其他
- savedInstanceState知道么,干什么用的,什么时候有值,什么时候为空,平时是怎么用的
- Android中main方法入口在哪里
- 为什么 Google 会推出Fragment ,有什么好处和用途? 直接用 View 代替不行么?
- Fragment的replace和end的区别?
- SharedPrefrences的apply和commit有什么区别?
- Bundle机制
- 动态加载
- android api层的源码熟悉哪些?解释一下
- 推送消息有富文本么
- 是否熟悉Android jni开发,jni如何调用java层代码
- webwiew了解?怎么实现和javascript的通信?相互双方的通信。@JavascriptInterface在?版本有bug,除了这个还有其他调用android方法的方案吗?
- ReactiveNative了解多少
8.6 gradle、打包、编译
- 描述点击Android Studio的build按钮后发生了什么
- gradle熟悉么,自动打包知道么
- gradle打包流程熟悉么
九、进程、线程、协程
- synchronize用法
- volatile用法
- 进程保活
- TreadLocal原理
- SP是进程同步的吗?有什么方法做到同步
- 线程间操作List
- 进程和Application的生命周期
- handler机制(需要关注细节:如何线程如何建立和退出消息循环等)
- 多线程(关于AsyncTask缺陷引发的思考)
- 进程间通信的方式
- 多线程断点续传原理
- Android系统为什么会设计ContentProvider,进程共享和线程安全问题
- 线程挂起,休眠,释放资源相关,唤醒,线程同步,数据传递,问了很多线程的问题,问了20分钟大概
- static synchronized 方法的多线程访问和作用,同一个类里面两个synchronized方法,两个线程同时访问的问题
- handler发消息给子线程,looper怎么启动
- BC三个线程,C线程要等A和B线程的结果,AB并行,问,跟什么数据结构类似....,不是问生产者消费者或者信号量什么的,>
- 线程同步的问题,常用的线程同步
- AsyncTask内部实现,关注默认线程池是一个串行的线程池;
- 讲解一下HandlerThread
- 同步的问题,常见的那些,锁机制,sychronized关键字,concurrent包下的数据结构,atom包下的数据结构
- 线程之间怎么通信
- 对应用里的线程有做统一管理么?
- 进程间通信方式?Binder的构成有几部分?
- Synchronize关键字后面跟类或者对象有什么不同。
- ThreadLocal是什么?Looper中的消息死循环为什么没有ANR?
- Runnable与Callable、Future、FutureTask的区别,AsyncTask用到哪个?- AsyncTask是顺序执行么,for循环中执行200次new AsyncTask并execute,会有异常吗
- 如果在当前线程内使用Handler postdelayed 两个消息,一个延迟5s,一个延迟10s,然后使当前线程sleep 5秒,以上消息的执行时间会如何变化?
- Android中进程内存的分配,能不能自己分配定额内存?
- 下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,onResume的时候怎么恢复
- CrashHandler实现原理?
- 怎么控制另外一个进程的View显示(RemoteView)?
十、性能优化
- 统计启动时长,标准
- 如何保持应用的稳定性
- 性能优化,如何保证应用启动不卡顿
- 怎么去除重复代码
- Android相关优化(如内存优化、网络优化、布局优化、电量优化、业务优化)
- 界面卡顿的原因以及解决办法
- 内存泄漏如何派出,MAT分析方法以及原理,各种泄漏的原因是什么比如
- Handler为什么会泄漏
- apk包大小有限制么?怎么减少包大小
- ANR是怎么回事,怎么查?Service会引起ANR么?
- anr是什么原因产生的,怎么排查
- 界面卡顿怎么排查和优化
- 界面上的话,有什么优化措施么?比如列表展示之类,平时遇到过内存问题吗?怎么优化
- 有什么提高编译速度的方法?
- 上线后的app性能分析检测有做么
- 内存优化,OOM的原因和排查方法
十一、JVM
- 谈谈classLoader
- 类加载器
- GC回收策略
- 对Dalvik、ART虚拟机有基本的了解
- DexClassLoader和PathClassLoader的区别
- 直接引用和符号引用相关
- GC回收机制熟悉么,分代算法知道么
- java的类加载原理
- gc相关的算法
- JVM的引用树,什么变量能作为GCRoot?GC垃圾回收的几种方法
十二、Java
- 内部类和静态内部类和匿名内部类,以及项目中的应用
- 泛型是什么以及在项目中的应用
- JNI和NDK熟悉么?Java和C方法之前的相互调用怎么做?
- java里带$的函数见过么,是什么意思
十三、数据库
- 数据库数据迁移问题
- 微信的聊天数据再本地都是加密处理的(防止root了被破解),设计一个类似的本地数据存储系统
- SQLite的数据库升级用过么
十四、项目相关
- 问项目,根据项目引申:主要有Asynctask和线程池,多进程以及IPC,GC相关(四种引用,怎么判断哪些内存该GC,GC算法),why,when,how 这些都是要从项目里面举出来例子
十五、适配
- dp是什么,sp呢,有什么区别
- Android8.0有哪些新特性
- 曲面屏的适配
十六、数据结构+算法
- 快速排序
- JSON字符串解析算法及优化
- 求一个字符串的最长回文
- 给定一个数,以及有序数组,求出来数组里面两个数的和等于给定数的下标
- 二叉树中序遍历,深度优先广度优先,不用递归算法的方法
- 求二叉树第k层节点个数;
- 实现一个栈push,pop,getMaxElementValue,时间复杂度要求0(1)
- 有序数组0(n)时间复杂度求一组和为sum的数组下标
- 算法熟悉么?给了一个二叉排序树,出了个给定结点找到它的下一个元素(只的是大小顺序的下一个)的算法题
- 三个算法题选一个并写出测试用例:打印n-m之间所有的素数;计算n-m之间1出现的次数;指定数字序列的排序;
- 微信跳一跳外挂怎么实现,检测怎么做的?
- 一张纯色背景下怎么有效检测各个矩形?
十七、开源库
- EventBus实现原理
十八、衍生话题
- Android相关你最擅长哪一块
- 自己负责过哪些模块,跟同事相比自己的优势是什么
- 遇到过什么印象深刻的问题,怎么解决的
- 项目团队多少人,怎么分配工作
- 比如:多人协同开发可能对一些相同资源都各自放了一份,有没有办法自动检测这些重复之类
- 为什么找工作,自己的优势是什么
- 平时用过什么开发工具,分析工具
- 有博客和github,主要是写的什么?有哪些关注
- 任意提问环节:其实可以问之前面试中遇到的问题:比如,多模块开发的时候不同的负责人可能会引入重复资源,相同的字符串,相同的icon等但是文件名并不一样,怎样去重?
- 工作中有没有用过或者写过什么工具?脚本,插件等等
- 除了日常开发,其他有做过什么工作?比如持续化集成,自动化测试等等
- 开放问题:如果提高启动速度,设计一个延迟加载框架或者sdk的方法和注意的问题。
- 分享下项目中遇到的问题
十九、动画
- Android中的动画有哪些
二十、JNI
- 写过native的底层代码
- 对接的so算法了解么,有接触过相关的库么
- jni的算法提供都是主线程的?是不是想问服务类的啊
二十一、设计模式
- 平时用过哪些设计模式
- Android中常用的设计模式,说三个比较高级的?
- 单例的DCL方式下,那个单例的私有变量要不要加volatile关键字,这个关键字有什么用
二十二、热修复
- 热修复相关的原理,框架熟悉么
二十三、权限
- 没有给权限如何定位,特定机型定位失败,如何解决?
- Android程序运行时权限与文件系统权限
二十四、Json
- 实现一个Json解析器(可以通过正则提高速度)。
二十五、版本控制工具
- 如何解决git冲突?
二十六、杂
- Jenkins持续集成。
二十七、gradle和打包
- Debug跟Release的APK的区别?