Android 面试题大纲
# Java面试题
# Java基础
- Java中引用类型有哪些
- 什么是重载,什么是重写,有什么区别
- String、StringBuffer、Stringuilder的区别
- 关键字final和static是怎么使用的
- TCP/IP协议族分哪几层?TCP、IP、XMPP、HTTP分别属于哪一层?
- Serializable / Parcelable
- Serializable作用
- Serializable优点
- Parcelable作用
- Parcelable优
- ClassLoader
- BootstrapClassLoader
- 加载路径
- ExtClassLoader
- 加载路径
- AppClassLoader
- 加载路径
- PathClassLoader
- 加载路径
- DexClassLoader
- 加载路径
- BootstrapClassLoader
- 线程池
- 线程
# Java中的设计模式
- 设计模式六大原则
- 你所知道的设计模式有哪些
- 单列设计模式
- 工厂设计模式
- 建造者设计模式(Builder)
- 适配器设计模式
- 装饰模式(Decorator)
- 策略模式(Strategy)
- 观察者模式(Observer)
# Android UI基础知识
- RecyclerView、ListView
- RecyclerView缓存机制
- ListView缓存机制
- 为什么会图片错位
# Android基础知识
# Activity
- 什么是Activity
- 请描述一下Activity生命周期
- Activity的四种启动模式,singletop和singletask区别是什么?一般书签的使用模式是sigletop,那么为什么不使用singletask?
- 常见的Activity类型有FragmentActivity、ListActivity、TabActivity等,请描述一下Activity生命周期
- 如何保存Activity的状态
- 两个Activity之间跳转时必然会执行的是哪几个方法?
- 横竖屏切换时Activity的生命周期
- 如何将一个Activity设置成窗口的样式
- 如何退出Activity?如何安全的退出已经调用多个Activity的Application?
- Android中的Context、Activity、Application有什么区别
- 两个Activity之间传递数据,除了Intent、广播接受者、content provider,还有啥?
- Context是什么?
- Activity的Task
- ANR时长
# Service
- Service是否在main thread中执行?service里面是否能执行耗时的操作?
- Activity怎么和Service绑定,怎么在Activity中启动自己对应的Service?
- 请描述一下Service的生命周期,bindService生命周期
- 启动方式
- 什么是IntentService?有何优点?
- 说说Activity、Intent、Service是什么关系
- Service和Activity在同一个线程吗
- Service里可以弹吐司么
- 什么是Service以及描述下它的生命周期。service有哪些启动方法,有什么区别,怎么停用Service?
- 在service的生命周期方法onStartCommand()可不可以执行网络操作?如何在Service中执行网络操作?
- Service类型
- 按地点分类
- 本地Service
- 远程Service
- 按运行分类
- 前台Service
- 后台Service
- 按功能分类
- 可通讯Service
- 不可通讯Service
- 按地点分类
- 自动销毁Service
- startService不会自动销毁,调用者销毁后还在
- bindService会自动销毁,随着调用者(Activity)销毁而销毁
- startService+bindService,调用者销毁后还在,但会调用onUnBind(),需要手动stopService才能销毁
- ANR时长
# Broadcast Receiver
- 请描述一下BroadcastReceiver
- 在manifest和代码中如何注册和使用BroadcastReceiver
- BroadcastReceiver的生命周期
- 无序广播
- 有序广播
- 粘滞广播
- 系统广播种类
- 广播优先级
- 动态注册
- 静态注册
- ANR时长
- 能否BindService
- 不可,但可startService
- BindService必须是Activity的Context
# ContentProvider
- 请介绍下ContentProvider是如何实现数据共享的
- 请介绍下Android的数据存储模式
- 为什么要用ContentProvider?它和sql的实现上有什么差别?
- 说说contentProvider、ContentResolver、ContentObserver之间的关系
# Fragment
- Fragment和Activity之间是如何传值的
- 描述一下fragment的生命周期
- Fragment的replace和add方法的区别
- Fragment如何实现类似Activity栈的压栈和出栈效果的?
- Fragment在你们项目中的使用
- 如何切换Fragment,不重新被实列化?
- Fragment与Fragment通讯方式
- Fragment与Activity通讯方式
- 回退栈
- 创建方式
- 静态创建
- 动态创建
- 静态创建
- 销毁与重建
# Intent
- Intent传递数据时,可以传递哪些类型数据?
- Serializable和Parcelable的区别
- 请描述下Intent和IntentFilter
- IntentFilter
- Action
- Category
- Data
- 传递数据类型
# Context
- 什么是Context
- 它描述的是一个应用程序环境的信息,即上下文
- 该类是一个抽象(abstract class)类,Android 提供了该抽象类的具体实 现类(ContextIml)
3.通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作, 例如:启动一个 Activity,发送广播,接受 Intent,信息,等
- Context, Activity,Appliction的区别
- Context是程序的上下文,通过它可以获取程序中各种资源
- Activity和Application都是Context的子类
- Activity和Application维护的的生命周期不一
# SharePerferences
# URI/URL
- 什么是URI
- 什么是URL
# Bitmap
# WebView
(WebView)[https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650825278&idx=1&sn=312f61cac2d4a2839e7457fa7e77fe76&chksm=80b7b6a0b7c03fb6f528fc23825a98a1ab33945d479eab5dea8a5464350daf2c5efd49ad1e62&mpshare=1&scene=1&srcid=0412t0eUjki3R7DgS9snTadF#rd]
- JS交互
- WebView隐患
- 优化WebView
# NotifiCationCompat
# MediaPlayer
# Handler
- Looper
- Message Queue
- ThreadLocal
- Message
- Handler
# AsycTask
# Binder
- 序列化与反序列化的过程
# AssetManager
# ActivityManager
# SystemManager
# WindowManager
# PackageManager
# ResoureceManager
# ClassLoader
# WIFI机制
# 蓝牙机制
# NFC机制
# Android高级
# 子线程与主线程交互方式和优缺点
# Android性能优化
- 如何对Android应用进行性能分析?
- 什么情况下会内存泄漏
- 如何避免OOM
- Android中如何捕获未捕获的异常
- ANR是什么?怎么避免ANR和解决ANR(重要)
- Android线程间通信方式有那几种?(重要)
- Devik进程,Linux进程,线程的区别
- 描述下Android的系统架构
- android应用对内存是如何限制的?我们应该如何合理使用内存
- 简述下Android应用程序结构是哪些?
- 请解释下Android程序运行时权限与文件系统权限的区别
- Framework工作方式及原理,Activity是如何生成一个View的,机制是什么?
- 多线程通信和多进程之间通信有什么区别,分别怎么实现?
- 内存优化
- 卡顿优化
- 电量优化
- APK体积优化
- 内存泄漏、内存溢出 http://mp.weixin.qq.com/s/8bQ4ES5SBvnvPoaw8aGcig
- 内存泄漏引发的问题
- 可能使程序造成卡顿的现象,或者莫名的消失,因为内存过大,系统就更可能的回收这一块的内存,或者直接崩溃
- 内存泄漏的原因
- handler等生命周期较长的匿名内部类,因为这些匿名内部类可能会持有外部的引用,
从而导致短期内就算Activity退出而一些资源没有被回收,数据结构未优化,图片没有优化,
没有注意到对象的生命周期,造成许多对象没有被回收,过多的使用Service,单例的过多使用,无效的资源等等
- handler等生命周期较长的匿名内部类,因为这些匿名内部类可能会持有外部的引用,
- 内存泄漏引发的问题
# Android屏幕是配
- 屏幕适配方式有哪些
- 屏幕适配的处理技巧有哪些
- 5.0适配
- 6.0适配
- 7.0适配
- 8.0适配
- 9.0适配
- 屏幕适配
- 资源适配
# AIDL
什么是AIDL以及怎么使用
AIDL的全称是什么?如何工作,能处理哪些类型数据?
# Android中的事件处理
- Handler机制
- 事件分发机制
- 子线程发消息到主线程进行更新UI,除了Handler和AsyncTask,还有什么?
- 子线程能不能new Handler?为什么?
# Android中的动画
- Android中的动画分几类,他们的特点和区别是什么?
- 如何修改Activity进入和退出动画
- 属性动画,例如一个button从A移动到B点,B点还是可以响应这个点击事件,这个原理是什么?
# ContentObserver内容观察者作用及其特点
# 源码分析
- UI的自定义View
- 事件拦截和分发机制
# Android Framework
App的启动过程
Activity启动流程
Handler
GC
adb命令
View体系
- View生命周期
- View事件
- 刷新机制
- View绘制流程
- onLayout
- onMeasure
- onDraw
- requestLayou、invalidate、postInvalidate区别
- requestLayout
- invalidate
- postInvalidate
- 更新UI的方式
- Handler
- runOnUiThread
原理很简单,就是传入一个Runnalbe,Activity会判断当前是否在主线程,如果是,
直接调用Runnable.run,直接调用run不是启动线程这点都知道吧,如果不是主线程
则调用Activity内部持有的主线程的Handler发送一个Post,这个POST也不是开启线程的,
熟悉Handler的应该知道,这篇文档也会说Handler - view.post
- 特殊情况子线程能更新UI,子线程更新UI时候会经过ViewRootImpl的checkThread判断是否是主线程,
但是这个ViewRootImpl是在OnResume的时候才创建出来的,所以在onCreate到onResume之前是可以有时间在子线程更新UI的
辅助工具
- Scoller
# 开源框架
# OkHttp
# Rxava
# Retrofit
# 框架的使用
- Gradle命令
一、 自我介绍
二、 开发中都使用过哪些框架、平台
三、 都使用过哪些自定义控件
四、 自定义控件:绘制圆环的实现过程
五、 自定义控件:摩天轮的实现过程
六、 自定义控件:可拖拽排序的GridLayout的实现过程
七、 流式布局的实现过程
八、 项目的流程
九、 项目中常见的问题
十、 即时通讯是是怎么做的?
十一、 设计模式六大原则
十二、 第三方登陆
十三、 第三方支付
十四、 常见框架分析
# 网络请求
- HTTP协议
- 请求过程
- TCP与UDP的区别。
- TCP和UDP报文结构。
- TCP的三次握手与四次挥手过程。
- TCP可靠传输原理实现(滑动窗口)。
- TCP拥塞控制。
- TCP流量控制。
- Http的报文结构。
- Http的状态码。
- Http的请求方法。
- Http1.1和Http1.0及2.0的区别
- Http长连接。
- Cookie、Session、TOKEN的作用和原理。https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650825233&idx=1&sn=5ec8c8285771deaf9278f30cda6b21c3&chksm=80b7b68fb7c03f997e6723e3dce4fb6746d2ff157c0281fd3a22ac4c6e01100e5fc8f9c7eca8&mpshare=1&scene=1&srcid=0412IXGvWvDkcy5z357Bz0Ss#rd
- Https加密原理。
# 各种SDK操作策略
1. 推送
1. APP关闭后推送策略
1. IM通讯
1. 记录存取
1. 统计
1. 自定义埋点
1. 地图
1. 启动定位、关闭定位
1. 保存上一次请求作为下一次初始值
1. 支付
1. 加密
1. 回调
# 其他
解决过一些性能问题,以及项目中的实际应用。
性能优化工具:TraceView、Systrace、调试GPU过度绘制 & GPU呈现模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker、LeakCanary、Lint。
性能优化方向:网络,内存,绘制,电量,APK瘦身
IntentService原理及使用
缓存自己实现怎么做?LruCache原理
图形图像相关,如OpenGL ES管线流程,EGL的认识,Shader相关
SurfaceView,TextureView,GlSurfaceView区别,使用场景?
glide缓存策略?同一个图片跟size有关么
android中的动画有哪些
View事件传递机制
界面卡顿怎么排查和优化?
Fragment的replace和end??的区别?
MVP,MVVM,MVC解释和实践
项目之外的,对技术的见解,拓展知识
微信跳一跳外挂怎么实现,检测怎么做的?
一张纯色背景下怎么有效检测各个矩形?
对接的so算法了解么,有接触过相关的库么?
三个算法题选一个并写出测试用例:打印n-m之间所有的素数;计算n-m之间1出现的次数;指定数字序列的排序;
android api层的源码熟悉哪些?解释一下
ACTION_CANCEL什么时候触发,触摸button然后滑动到外部抬起会触发点击事件吗,在+ + 滑动回去抬起会么
怎么处理嵌套View的滑动冲突问题
热修复相关的原理,框架熟悉么
gradle打包流程熟悉么
任意提问环节:其实可以问之前面试中遇到的问题:比如,多模块开发的时候不同的负责人可能会引入重复资源,相同的字符串,相同的icon等但是文件名并不一样,怎样去重?
Canvas的底层机制,绘制框架,硬件加速是什么原理,canvas lock的缓冲区是怎么回事
surfaceview, suface,surfacetexure等相关的,以及底层原理
android文件存储,各版本存储位置的权限控制的演进,外部存储,内部存储
上层业务activity和fragment的遇到什么坑??页面展示上的一些坑和优化经验
网络请求的开源框架:OKHttp介绍,写过拦截器么
数据层有统一的管理么,数据缓存是怎么做的,http请求等有提供统一管理么?
有用什么模式么,逻辑什么的都在Activity层?怎么分离的
如果用了一些解耦的策略,怎么管理生命周期的?
有什么提高编译速度的方法?
对应用里的线程有做统一管理么?
jni的算法提供都是主线程的?是不是想问服务类的啊
边沿检测用的啥?深度学习相关的有了解么?
上线后的app性能分析检测有做么
进程间通信方式?Binder的构成有几部分?
HttpClient和HttpConnection的区别
View的事件传递机制
MVC,MVP,MVVM分别是什么?
Android中常用的设计模式,说三个比较高级的?
内存优化,OOM的原因和排查方法
想改变listview的高度,怎么做
Https是怎么回事?
除了日常开发,其他有做过什么工作?比如持续化集成,自动化测试等等
IntentService和Service
dp是什么,sp呢,有什么区别
自定义View,ViewGroup注意那些回调?
Android界面卡顿的原因以及解决方法
android中的存储类型
service用过么,基本调用方法
Handler机制
LinearLayout、FrameLayout、RelativeLayout性能对比,为什么
Activity的生命周期,finish调用后其他生命周期还会走么?
FW层熟悉么,源码看过么
GC回收机制熟悉么,分代算法知道么
Java的类类加载原理
内存泄漏如何排查,MAT分析方法以及原理,各种泄漏的原因是什么比如
Handler为什么会泄漏
gradle熟悉么,自动打包知道么
介绍下先的app架构和通信
自己负责过哪些模块,跟同事相比自己的优势是什么
遇到过什么印象深刻的问题,怎么解决的
最近都做了哪些工作?
遇到了什么印象深刻的问题。A:会顺着你介绍的项目问下具体实现。
推送消息有富文本么?
热修复了解么,用的什么?
apk包大小有限制么?怎么减少包大小?
工作中有没有用过或者写过什么工具?脚本,插件等等
比如:多人协同开发可能对一些相同资源都各自放了一份,有没有方法自动检测这种重复之类的
写过native的底层代码么
view的绘制熟悉么,介绍下
gc相关的算法
anr是因为什么产生的,怎么排查
界面上的话,有什么优化措施么?比如列表展示之类的,平时遇到过内存问题吗,怎么优化的?
平时用过哪些设计模式?
介绍下最近一年主要做了什么工作
会对简历上突出的技能进行详情的询问:
比如:音频合成的具体步骤,以及遇到的一些问题和细节处理。
会根据面试发散一些问题,问到,seek方法播放到末尾后重新播放会有一些卡顿的不流畅问题,怎么避免,从交互设计或者技术角度。(个人表示没怎么关注这种)。项目团队多少人,怎么分配工作
线程之间怎么通信的?
app的架构是怎么样的,并且为什么这样,有什么优缺点?
算法熟悉么?给了一个二叉排序树,出了一个给定节点找到它的下一个元素(指的是大小顺序的下一个)的算法题。
为什么找工作,自己的优势是什么
技术问题不再局限于简历,可能根据简历和回答情况渐进并扩散。
感觉各个技术面试官之前并没有沟通,可能会问到类似的问题
介绍下自己主要负责的工作
Activity的生命周期有哪些,知道onRestart么,介绍下
savedInstanceState知道么,干什么用的,什么时候有值,什么时候为空,平时是怎么用的
View绘制熟悉么,介绍下,能说下是实现原理么?
平时用过什么开发工具,分析工具?
ANR是怎么回事?怎么查?Service会引起ANR么?
Activity的启动模式有哪些?栈里是A-B-C,先想直接到A,BC都清理掉,有几种方法可以做到?这几种方法产生的结果是有几个A的实例?
有什么工具可以看到Activity栈信息么?多个栈话,有方法分别得到各个栈的Activity列表么
都熟悉哪些命令?知道怎么用命令启动一个Activity么?
SharedPrefrences的apply和commit有什么区别
java里带$的函数见过么,是什么意思
MD5是加密方法么,Base64呢
有博客和github,主要是写的什么?有哪些关注
android 8.0 有哪些新特性
差不多就这些吧。。最后每个面试官都会让你问他问题。
ActivityA跳转ActivityB然后B按back返回A,各自的生命周期顺序,A与B均不透明。
Synchronize关键字后面跟类或者对象有什么不同。
单例的DCL方式下,那个单例的私有变量要不要加volatile关键字,这个关键字有什么用
JVM的引用树,什么变量能作为GCRoot?GC垃圾回收的几种方法
ThreadLocal是什么?Looper中的消息死循环为什么没有ANR?
Android中main方法入口在哪里
jdk1.5?SparseArray和ArrayMap各自的数据结构,前者的查找是怎么实现的,与HashMap的区别
Runnable与Callable、Future、FutureTask的区别,AsyncTask用到哪个?- AsyncTask是顺序执行么,for循环中执行200次new AsyncTask并execute,会有异常吗
IntentService生命周期是怎样的,使用场合等
RecyclerView和ListView有什么区别?局部刷新?前者使用时多重type场景下怎么避免滑动卡顿。懒加载怎么实现,怎么优化滑动体验。
SQLite的数据库升级用过么
开放问题:如果提高启动速度,设计一个延迟加载框架或者sdk的方法和注意的问题。
Scroller有什么方法,怎么使用的。
分享下项目中遇到的问题
webwiew了解?怎么实现和javascript的通信?相互双方的通信。@JavascriptInterface在?版本有bug,除了这个还有其他调用android方法的方案吗?
ReactiveNative了解多少
JNI和NDK熟悉么?Java和C方法之前的相互调用怎么做?
ams pms wms
Crash怎么处理的啊,anr怎么处理的啊,那个crash和anr时候掏出来的对话框怎么弹出来的
怎么做插件化啊。。
Handlerthred intentservie啥原理啊
Intentservice需要关闭吗
谈谈架构呀,架构的基本原则呀,你喜欢用那个设计模式啊,
后台线程怎么拿主线程的异常栈啊?
组件化怎么做的呀??独立的组件怎么相互调用接口呀?
你说你做过gradle插件,那讲一下呗
字节码插桩这几个框架你用过呀。那你为啥选asm呀?
插件化来讲一下。。其他apk的resource怎么拿啊。。LoadedApk对象干啥用的??
Retorfit用了哪些设计模式呀??okhttp用了哪些呀??为啥用啊,你自己项目用了哪些啊,为毛用啊
Tinker原理是啥呀?
Application代理机制为啥要这样搞啊
谈谈架构的基本原则啊,结合下你自己经历,谈谈架构
Arouter源码看过吗??怎么搞依赖反转啊
Ui卡顿怎么检测啊,刷新机制是个啥啊,