Android面试题汇总

Activity相关

Fragment相关

Fragment生命周期和Activity生命周期

activity_fragment_lifecycle.jpg
activity_lifecycle.jpg

fragment_lifecycle.jpg

Service相关

Android布局优化之ViewStub、include、merge

BroadcastReceiver 相关

  • Android 基础常识
  • BroadcastReceiverDemo

AsyncTask相关

  • 菜鸟看源码之AsyncTask
  • Android AsyncTask完全解析,带你从源码的角度彻底理解

Android 事件分发机制

  • Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
  • Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
  • Android事件分发机制

Android View 绘制流程

  • Android LayoutInflater原理分析,带你一步步深入了解View(一)
  • Android视图绘制流程完全解析,带你一步步深入了解View(二)
  • Android视图状态及重绘流程分析,带你一步步深入了解View(三)
  • Android invalidate是如何导致View重绘的

Android Window、Activity、DecorView以及ViewRoot

Android的核心Binder多进程AIDL

AMS,WMS,PMS

  • (连载)Android 8.0 : 如何下载和阅读Android源码
git clone https://android.googlesource.com/platform/frameworks/base

替换成

git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base
  • Android 镜像使用帮助
  • Android解析ActivityManagerService(一)AMS启动流程和AMS家族
  • Android解析WindowManagerService(一)WMS的诞生

Android ANR

  • Android性能优化(七)之你真的理解ANR吗?
  • 彻底理解安卓应用无响应机制

Android 内存相关

  • Android 内存泄漏分析

Android 屏幕适配

  • 屏幕兼容性概览

Android 缓存机制

Android 性能优化

Android MVC、MVP、MVVM

  • 如何构建Android MVVM 应用框架
  • humanheima/archi

Android Gradle 常识(暂时不看)

  • 配置编译版本

RxJava

OkHttp

OkHttp是一个高效HTTP客户端,原因如下:

  • HTTP/2支撑请求同一个host的多个请求共享一个socket连接。
  • 连接池降低请求延迟(HTTP/2不可用的情况)。
  • 透明的GZIP压缩下载体积。
  • 响应缓存,避免完全重复的request发起网络请求,可以直接从缓存里面获取响应。

当OkHttp遇到网络问题的时候,它会静默的从常见的连接问题中恢复。如果你的服务有多个IP地址,当第一次连接失败的时候,OkHttp会尝试其他的地址。对于IPv4+IPv6以及服务放在多个数据中心的情况,这是很重要的。OkHttp支撑先进的TLS(传输层安全协议)特性。

使用OkHttp很简单。它的request/response API都是使用构建模式创建,并且是不可变的。OkHttp支撑同步和异步请求。

HTTP1.0、HTTP1.1 和 HTTP2.0 的区别

  • HTTP1.0、HTTP1.1 和 HTTP2.0 的区别

Retrofit

Android 热更新与插件化

Android组件化

卡顿相关

卡顿原因是什么,如何检测卡顿,怎么判断是页面响应卡顿还是逻辑处理造成的卡顿?

卡顿原理是什么:60帧每秒是目前最合适的图像显示速度,也是绝大部分Android设备设置的调试频率,如果在16ms内顺利完成界面刷新操作可以展示出流畅的画面,而由于任何原因导致接收到VSYNC信号的时候无法完成本次刷新操作,就会产生掉帧的现象,刷新帧率自然也就跟着下降(假定刷新帧率由正常的60fps降到30fps,用户就会明显感知到卡顿)

造成卡顿的常见原因:

  1. 过度绘制
  • 去除不必要的背景
  • 布局文件扁平化
  • merge、ViewStub标签的使用
  1. UI线程中有耗时操作,I/O读写、数据库访问等;
  • 减少ui线程中的耗时操作
  1. 频繁的GC
  • 避免内存抖动,瞬间创建大量的临时对象。不要在for循环中去new对象或在onDraw方法中创建对象等。
  • 避免内存泄漏。

如何检测卡顿?

  • StickMode
  • TraceView(已被弃用,考虑使用 Android Studio自带的CPU Profiler)
  • AndroidPerformanceMonitor
  • ANR-WatchDog
  • Choreographer

推荐使用 AndroidPerformanceMonitor和Android Studio自带的CPU Profiler

怎么判断是页面响应卡顿还是逻辑处理造成的卡顿?
关于运算阻塞导致的卡顿的分析可以使用TraceView(已被弃用,考虑使用 Android Studio自带的CPU Profiler)

备注:我的理解页面响应卡顿就是指布局过于复杂、过度绘制造成的卡顿。可以打开发开者选项里的OverDraw(调试GPU过度绘制)和GPU呈现模式来查看

  • AndroidPerformanceMonitor(BlockCanary)源码分析参考这篇文章 Android中UI性能分析原理。源码可以参考:https://github.com/humanheima/AndroidPerformanceMonitor
  1. Android性能优化(六)之卡顿那些事
  2. Android APP 卡顿问题分析及解决方案
  3. Android UI性能优化 检测应用中的UI卡顿

Handler 机制原理,IdleHandler 什么时候调用。

LeakCanary 原理,为什么检测内存泄漏需要两次?

我的理解为什么要检测两次?

  1. 如果在activity destroy以后并且在5秒钟之后系统没有进行gc,那么activity对象是没有被回收的,此时大家检测发现activity对象没有被回收,然后大家再手动调用一次gc,gc过后,大家再检测一次activity对象是否被回收,如果被回收了,那么结束,如果activity对象还是没有被回收说明很可能出现了内存泄漏无法被回收,所以大家就并dump出当前的内存文件供之后进行分析。

属性动画、补间动画、帧动画的区别和使用场景;

  • Android 动画框架详解,第 1 部分 这篇文章讲了补间动画实现原理

  • Android应用开发之所有动画使用详解

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

APK 瘦身是怎么做?

冷启动优化

Android性能优化(一)之启动加速35%
https://zhuanlan.zhihu.com/p/86283192

RecyclerView相关

源码过于复杂,暂时不去了解

如何判断一个 APP 在前台还是后台?

  • Android--判断App处于前台还是后台的方案

代码可以参考
https://github.com/humanheima/ActivityDemo

如何做应用保活?全家桶原理?

Retrofit 在 OkHttp 上做了哪些封装?

  • Okhttp 与 Retrofit的简单先容及两者间的联系
  • Java动态代理

invalidate和requestLayout的区别

  1. requestLayout和invalidate 区别

Parcelable & Parcel

Parcel是一个可以通过IBinder来发送的消息 (data and object references) 容器。Parcel不是一个通用的序列化机制。Parcelable & Parcel和被设计成一个高性能的IPC传输。因此,Parcel数据不适合持久存储(存储在文件中)。

Parcelable的原理
如何将 Parcelable 保存到本地文件里

ButterKnife

加载超级大的图片

  • Android 高清加载巨图方案 拒绝压缩图片
  • subsampling-scale-image-view

推荐阅读更多精彩内容