每次面试过后,我都会把能想起来的面试题记录下来,方便及时补充知识。
下面记录的,都是我近年面试Android岗位所碰到的面试题,基本都是一些知名公司,为避免不必要的麻烦,公司名就隐去了,面试前可对照此面试题列表一一复习。
(本文删过一段时间,后来又重新发出了。所以网上看到别人复制我的,发表时间却比我早,汗……)
D办公面试题:
- app保活的方式
- 对binder的了解
- ANR的发生原因
- OOM的发生原因,如何分析
- 哪些工具来分析app性能
- 在Application的attachBaseContext 方法做耗时操作会ANR吗
- Handler为什么会造成内存泄漏?相关对象是怎么持有的
- Retrofit的原理,动态代理可以传入类而不传入接口吗
- OKHttp的请求复用
- 有哪些线程安全的容器,及其原理
- 如何创建多进程,Activiy和Service如何通信
- onSaveInstanceState()和onRestoreInstanceState()调用时机
- Looper.prepare()做了什么
- RxJava多次调ObserverOn,哪次生效
ZJ面试题:
1.HTTP基础操作有哪些,HTTPS的S是什么
2.webview加载比较慢怎么解决
3.Java线程安全有哪几种方式,synchronized和lock的区别,重量级锁
4.handler机制的几种角色,handler发送和接收消息,是靠什么实现的
5.handler的barrier机制,IdleHandler的运作
6.service的两种启动方式的区别,bindService的应用场景
7.怎么衡量app性能,用哪些指标,工具
8.anr的发生有哪些原因
9.有序和无序广播引发anr,一样吗
10.sharedPreference有哪些缺陷,为什么不能存大数据,存了会怎样
11.组件化的方案,组件间如何通信
12.ARouter的原理,缺陷
13.使用的网络请求框架,有做哪些优化
14.进程和线程的区别(本质)
15.Android如何创建多进程,什么场景会用到多进程
16.Android进程间通信的方式,Linux进程间通信的方式
17.android为什么使用binder作为通信机制,某场景为什么使用socket
18.TCP和UDP的区别,HTTP用的是哪个,UDP的使用场景
- Java 有哪些锁
- HashMap原理,红黑树原理,为什么能提升效率,时间复杂度
- Handler的postDelay原理
- 工作中做的最有挑战性的事
某视频app公司面试题:
- Activity启动模式。
- Activity生命周期,从A页面打开B页面,两个页面的生命周期。
- onStartCommand的返回值和参数的作用。
- Synchronized关键字。一个线程访问某个类的Synchronized成员方法A,同时另一个线程可以去访问这个类的Synchronized成员方法B吗?
- App的启动优化。
- Handler,Looper,MessageQueue的关系。Handler通过sendMessageDelayed发送延时消息, 消息什么时候入队列?
- 主线程的Looper死循环为什么不会导致ANR?
- Android 动画的实现方式。
- 项目中有没有用到组件化,如何实现组件化。
- Hybrid开发中Android和H5的交互有哪些方式。
- 项目是怎样的架构,为什么这么搭建。
某BS物流公司的面试题;
- 本地广播和全局广播的区别,本地广播的实现原理。
- 常见第三方框架及其实现原理。
- SQLite数据库操作。
- Http请求中包含哪些内容,上传文件和发起请求的post请求的区别。
- 线程池有哪几种,如何运用。
- 设计实现大批量数据上传的方式。
- MVC,MVP,MVVM架构的区别。
- 如何解决Handler导致的内存泄漏。
- 进程间通信的方式。
某厂TB电商及CN物流岗位的面试题:
- View的绘制流程。
- 实现延时任务的几种方式,postDelay,AlarmManager,TimerTask的区别。
- 做过哪些优化性能的工作?如何考量优化的成果。
- http和http2.0,以及https的不同。
- Art虚拟机和Dalvik虚拟机。
- 三级缓存的原理。
- LruCache算法的原理。
- 项目中用到了哪些设计模式,Android源码中用到设计模式的场景。
- Java8有什么新特性。
- Java类如何加载,类加载的过程。
- 页面卡顿如何解决,viewHolder起什么作用。
- 如果有大数据量网络请求,该如何优化
另某厂电商KL应用岗位面试题;
- 在浏览器输入网址到打开网页,中间的过程。
- 如何统计工程的代码量?如何去掉代码注释的影响?
- 模式匹配
- apt ,aop
- 标签注解的原理
- 热修复的原理。
- 线程池的原理,如果核心线程数5,最大线程数10,新来的线程会怎样?
- 如何在服务器接口未准备好的情况下调试接口?
- 如何抓取Https传输的数据?
- Android 与Js的交互,接口存在的安全隐患及修复
- 不同方式创建字符串,通过==和quuals比较的结果
WY音乐多媒体岗位面试题:
- 对第三方框架的了解。EventBus可以跨进程通信吗?
- Android P有什么新特性,后台限制策略是通过怎样的API来处理的?
- HashMap的原理,hashCode的作用,重写equals为什么要重写hashCode方法
- Synchronizd修饰静态方法也修饰了非静态方法,可以在两个线程同时被调用吗?
- padding和margin的区别。给固定大小及wrap_content的textView设置padding,它的可点击区域会变化吗?
- 如何自定义view, Canvas的作用
- onMesure()方法的参数,MeasureSpec的结构
- 动画有哪几种?属性动画怎么用,插值器什么作用
- 讲一下include,merge 和viewstub。 viewstub可以被重复加载吗?在view树里是怎样的存在?
- 对线程的理解,线程同步有哪几种方式
- final关键字的作用,为什么匿名内部类里用到的变量必须是final类型的?
- handler, Looper, MessageQueue的关系,这三个可以一对多吗?怎么保证message能被其对应的handler处理?
- 触摸事件传递过程。有个竖向滑动的ViewGroup里嵌套了横向滑动的view,如何处理滑动冲突?
- onSaveInstanceState触发的时机。
某母婴平台部分面试题:
- 自定义view时如何刷新布局,invalidate会改变宽高吗
- Java泛型是伪泛型吗
- new Integer(1) == 1会执行拆箱吗
- Looper无限循环为什么不会造成卡死
- 组件之间,activity如何跳转
- HTTPS及其双重检验
继续补充
某高校合作研究机构的面试题:
- HashSet的原理,如何保证元素不重复的
- 项目中登录密码是怎么加密的
- 如何保证HTTP通信的安全
- git存储的是快照还是差异
- aop 代理
- 了解哪些设计模式,讲解策略模式
- 泛型是怎么回事,类型擦除发生在什么时候
- 列出常用的Linux操作,如何查看内存占用
某小电商平台:
- 如何计算bitmap占用的内存
- 内存泄漏都有哪些可能的原因
- 数据库优化,异步操作数据库会不会导致内存泄漏,怎么解决
- MVP,MVVM模式。
某炒股平台面试题:
- 自己实现StringBuffer类及其append方法
- 如何优化ListView的显示
- 有多个应用都能接收某个action广播,如何做到广播只被特定的应用接收到
- 网络下载图片并保存到SD卡,过程涉及哪些IO类
- 实现3秒延时后给TextView设置文字。
- 有哪些措施能加强应用的安全性。
- apk加固的原理。
- 哪些情境会导致内存不一致
- 如何检测应用卡顿的原因
- 主线程要等待几个子线程处理完成后才能继续处理,该怎么实现
某人脸识别平台:
- activity启动过程
- BroadcastReceiver的工作原理
- HandlerThread和Thread的区别,HandlerThread在Android中哪些场景用到
- 普通线程以及线程池里的线程,如何给线程命名,设置优先级
- 某个工具类的方法,传入了activity的回调,怎么解决内存泄漏
- Object类的clone()是深克隆吗?怎么实现深克隆?
- IntentService是怎么新建线程的?
- MVP模式里,V是哪些?startService这样的操作,应该写在V里,还是P里
补充:
- synchronized的实现原理,和lock的区别。
- 多进程操作文件,怎么解决同步?
- CAS同步方法。
- binder的实现。
- 插件化的原理。如果自己去设计插件化的框架,怎么设计?注意哪些地方?
- 第三方框架及其原理。在用第三方框架时有没有做比较,了解项目之外的第三方框架吗?
- 如何分析ANR问题?腾讯Bugly这样的框架是什么原理。
- JNI开发,及原理。
- Java反射的原理。
- dex, odex是什么。
- Android系统开机过程。
- 面向切面编程。
- AutomicInteger的原理。
- 调用System.gc()会怎样,系统什么时候会触发GC。
- 线程的sleep和wait的区别。
- Google最新动态,Android最新变化等。
- 队列有哪几种。
- 从点击桌面图标,到App启动中间发生了什么。
- fragment生命周期,和activity的配合
- gilde加载图片
- HandlerThread
- Java 集合有哪些?哪些是线程安全的
- 类的加载及静态变量,成员变量等的初始化顺序。
- 线程池里的线程是如何复用的
- HTTP请求头,响应都包含哪些内容
- activity的四种启动模式分别在哪些场景会用到
- 弱引用和软引用的区别,使用场景
- 线程池里的任务如果发生异常了,会怎样
- 手写二分查找算法
- 栈内有个singleTask的activity,再次启动它时,生命周期怎样
- 设计一个埋点功能模块,应该怎么做?
- Java异常分为哪几类?RuntimeException包含哪些?
- Volley框架存储请求数据时,key是什么?
- 请基于数组实现队列。
- 如何防止网络请求里的数据被抓包
- fragmentTranstion有哪些操作?fragment如何回退?
- 多维数组的长度,及初始化
- surfaceView和View的区别
- 线程间如何通讯
- 自定义view时,如何在view被销毁时保存数据
- activity,window,view的关系
- 使用recyclerView实现三级item可伸缩的列表,如何实现
上面这些都是技术的问题,还有一些频繁被问到的体现技术能力的问题:
- 在工作中做过的最有难度的需求是什么,是怎么实现的。
- 工作中遇到的最难的Bug是怎样的,及解决过程。
- 工作中代码优化、性能优化等,是怎么做的,代码规范性如何保证。
- 在团队中担任怎样的角色,团队的开发流程是怎样的。
- 有开源项目吗?
- 平时怎么获取新知识。
另外,作为Android开发,只会Android和java的知识是不够的,虽然可以应付一般工作,但是如果想进阶的话,下面这些技能起码要掌握一二:
- Java虚拟机。推荐看《深入理解Java虚拟机》
- 设计模式。经典书籍很多,比如《大话设计模式》
- 数据库操作。
- Http,TCP/IP相关
- Android源码,底层实现。
- 跨平台开发技术,比如ReativeNative,flutter,week等。
- Android和其他方向的行业新技术,新动态
- Kotlin,python,Linux等。
这些面试题的答案贴出来的话太多了,而且还不一样全面准确。需要的话各位自己去研究,把这些都搞清楚并能在面试中流畅应对的话,相信通过中高级Android 面试是没问题的了。
祝成功~~