阿里云服务器2核4G 3年仅847元(点击查看)

Android中高级面试题汇总(2020年)

395次阅读
没有评论

Android中高级面试题汇总(2020年)

基础篇

Java基础

Java集合

  • ArrayList
  • HashMap (重点)
  • LinkedList
  • ConcurrentHashMap (重点)
  • LinkedHashMap (重点)
  • BlockingQueue

推荐阅读:

Java并发

Java虚拟机

JVM常见面试题

JVM内存结构

双亲委派模型

Android基础

Activity知识点(必问)

  • Activity启动过程全解析
  • 启动模式以及使用场景
  • onSaveInstanceState以及onRestoreInstanceState使用
  • onConfigurationChanged使用以及问题解决

Fragment知识点

推荐阅读:

  1. Fragment全解析系列(一):那些年踩过的坑
  2. Google-Fragment概览
  3. Google-与其他Fragment通信

Service知识点

Handler知识点(必问)

Handler Looper Message 关系是什么?
Messagequeue 的数据结构是什么?为什么要用这个数据结构?
如何在子线程中创建 Handler?
Handler post方法原理?
Handler消息机制,postDelayed会造成线程阻塞吗?对内存有什么影响?
当访问大量数据出现线程租塞用什么技术解决?
Handler机制是如何进行线程切换的?
答:这里先大致解释下,当Looper的loop方法被调用的时候,Looper会从MessageQueue中取出单链表中第一个msg(Message对象),之后会执行msg.target.dispatchMessage(msg),这个msg中有个target对象,然后target对象里有个dispatchMessage方法,dispatchMessage方法又会调用handleMessage,这时候机智的你肯定意识到了这个target其实就是Handler对象,其实这还不是重点,线程切换的重点在于loop方法是在线程A中执行的,所以即便消息是在线程B产生的,由于loop方法执行在线程A中,所以handleMessage方法也就执行在了线程A中,如果A是主线程,handleMessage方法也就回调在主线程了。

推荐阅读:

Intent知识点

数据存储

文件和数据库哪个效率高?

UI控件篇

事件分发(重点)

屏幕适配

  • dp+自适应布局+weight比例布局直接适配
  • 今日头条适配方式
  • 宽高限定符适配方式
  • smallestWidth适配

推荐阅读:

主要控件优化

RecyclerView优化

嵌套滚动

动态页面

电商类的APP使用居多

网络通信篇

网络协议

  • WebSocket 原理
  • 对称加密与非对称加密算法

推荐阅读:

网络安全

架构设计篇

MVP架构设计

组件化架构

业务大了代码多了会用到。
为什么要用组件化?
组件之间如何通信?
组件之间如何跳转?

设计模式

1.装饰者模式,代理模式,适配器,桥接模式有什么区别?

性能优化篇

【面试重点】性能优化:包括启动优化(主要是冷启动)、内存优化、绘制优化、稳定性优化、安装包体积优化等,优化是面试的重中之重。
你在开发中是如何做性能优化的?

启动优化

内存优化

绘制优化

什么情况下使用 ViewStub、include、merge?
他们的原理是什么?

安装包优化

稳定性优化

源码流程篇

开源库源码分析

RxJava的实现原理,它是如何实现线程的控制?
Retrofit的框架结构是什么?底层是怎么实现的?
网络框架是如何搭建?okhttp的底层实现是什么,和Retrofit有什么不同?
图片加载框架gilde、Picasso、fresco有什么不同,各自的实现原理是什么?如何搭建一个网络框架?

Glide源码分析

【面试题】
Glide的优点有哪些?
Glide的缓存原理是什么?


Glide的优点主要包括:

  • 多种图片格式的缓存,适用于更多的内容表现形式(如Gif、WebP、缩略图、Video)
  • 生命周期集成(根据Activity或者Fragment的生命周期管理图片加载请求)Glide可以感知调用页面的生命周期,这就是优势
  • 高效处理Bitmap(bitmap的复用和主动回收,减少系统回收压力)
  • 高效的缓存策略,灵活(Picasso只会缓存原始尺寸的图片,Glide缓存的是多种规格),加载速度快且内存开销小(默认Bitmap格式的不同,使得内存开销是Picasso的一半)

LeakCanary源码分析

OkHttp源码分析

【面试问题】

1.如何使用OkHttp进行异步网络请求,并根据请求结果刷新UI?
2.可否介绍一下OkHttp的整个异步请求流程?
3.OkHttp对于网络请求都有哪些优化,如何实现的?
4.OkHttp框架中都用到了哪些设计模式?
5.OKHttp有哪些拦截器,分别起什么作用?
6.OkHttp怎么实现连接池?
7.Okhttp 有哪些优势?

推荐阅读:


Okhttp优势:

1)支持http2,对一台机器的所有请求共享同一个socket
2)内置连接池,支持连接复用,减少延迟
3)支持透明的gzip压缩响应体
4)通过缓存避免重复的请求
5)请求失败时自动重试主机的其他ip,自动重定向
6)丰富的API,可扩展性好

Retrofit源码分析

RxJava源码分析

理解源码之前需要先了解一些RXJava基本知识

RxJava原理与源码分析

RxJava如何进行线程切换的?

Rxjava内存泄漏防止方案——RxLifecycle,AutoDispose,RxLife框架

Tinker源码分析

ARouter源码分析


路由框架原理:ARouter官方文档
【ARouter:现在模块化(组件化)算是比较常见的开发模式了,尤其是在大厂,所以有必要知道ARouter的实现原理,2个模块之间是怎样实现的页面跳转,以及ARouter为了优化性能做了哪些工作】
核心要点:将Route注解中的path地址和Activity.class文件的映射关系保存到它自己生成的java文件的map中
隐式跳转方案,但是一个项目中不可能所有的跳转都是隐式的,这样Manifest文件会有很多过滤配置,而且非常不利于后期维护。
反射跳转方案:需要拿到Activity的类文件,在组件开发的时候,想拿到其他module的类文件是很麻烦的,因为组件开发的时候组件module之间是没有相互引用的,你只能通过找到类的路径去反射拿到这个class。大量的使用反射跳转对性能会有影响。
APT是Annotation Processing Tool的简称,即注解处理工具。apt是在编译期对代码中指定的注解进行解析,然后做一些其他处理(如通过javapoet生成新的Java文件

Android框架层源码解析

Activity启动流程

Android中高级面试题汇总(2020年)

  1. 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. Zygote进程fork出新的子进程,即App进程;
  4. App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
  6. App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
  7. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。

推荐阅读:

Service启动流程

Android中高级面试题汇总(2020年)

启动流程:

  1. Process A进程采用Binder IPC向system_server进程发起startService请求;
  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. zygote进程fork出新的子进程Remote Service进程;
  4. Remote Service进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向remote Service进程发送scheduleCreateService请求;
  6. Remote Service进程的binder线程在收到请求后,通过handler向主线程发送CREATE_SERVICE消息;
  7. 主线程在收到Message后,通过发射机制创建目标Service,并回调Service.onCreate()方法。

推荐阅读:

事件分发机制

Android中高级面试题汇总(2020年)

  1. onInterceptTouchEvent返回值true表示事件拦截, onTouch/onTouchEvent 返回值true表示事件消费。
  2. 触摸事件先交由Activity.dispatchTouchEvent。再一层层往下分发,当中间的ViewGroup都不拦截时,进入最底层的View后,开始由最底层的OnTouchEvent来处理,如果一直不消费,则最后返回到Activity.OnTouchEvent
  3. ViewGroup才有onInterceptTouchEvent拦截方法。在分发过程中,中间任何一层ViewGroup都可以直接拦截,则不再往下分发,而是交由发生拦截操作的ViewGroup的OnTouchEvent来处理。
  4. 子View可调用requestDisallowInterceptTouchEvent方法,来设置disallowIntercept=true,从而阻止父ViewGroup的onInterceptTouchEvent拦截操作。
  5. OnTouchEvent由下往上冒泡时,当中间任何一层的OnTouchEvent消费该事件,则不再往上传递,表示事件已处理。
  6. 如果View没有消费ACTION_DOWN事件,则之后的ACTION_MOVE等事件都不会再接收。
  7. 只要View.onTouchEvent是可点击或可长按,则消费该事件.
  8. onTouch优先于onTouchEvent执行,上面流程图中省略,onTouch的位置在onTouchEvent前面。当onTouch返回true,则不执行onTouchEvent,否则会执行onTouchEvent。onTouch只有View设置了OnTouchListener,且是enable的才执行该方法。

推荐阅读:

Java层源码解析

HashMap底层实现,它和LinkHashMap有什么区别?

算法设计

时间复杂度

数据结构

新技术篇

Android Architecture Components

Android Architecture Components的核心是Lifecycle、LiveData、ViewModel 以及 Room,通过它可以非常优雅的让数据与界面进行交互,并做一些持久化的操作,高度解耦,自动管理生命周期,而且不用担心内存泄漏的问题。

  • Room 一个强大的SQLite对象映射库。
  • ViewModel 一类对象,它用于为UI组件提供数据,在设备配置发生变更时依旧可以存活。
  • LiveData 一个可感知生命周期、可被观察的数据容器,它可以存储数据,还会在数据发生改变时进行提醒。
  • Lifecycle 包含LifeCycleOwer和LifecycleObserver,分别是生命周期所有者和生命周期感知者。

Android Architecture Components的特点

  • 数据驱动型编程 变化的永远是数据,界面无需更改。
  • 感知生命周期,防止内存泄漏。
  • 高度解耦 数据,界面高度分离。
  • 数据持久化 数据、ViewModel不与UI的生命周期挂钩,不会因为界面的重建而销毁。

推荐阅读:

实战问题篇

面试篇

开源文档

  • Awesome-Android-Interview 随着Android技术发展的成熟,Kotlin、大前端技术Flutter、RN、小程序等一下子就进入了我们的视野内,同时,Android自身的技术栈也正在不断扩展,比如在国外大热的Jetpack。因此,Android开发者们越来越焦虑,越来越迷茫,每个人的时间和精力是有限的,我们到底应该学什么才能有效地提高自身的竞争力呢?其实,首先我们应该优先深入学习工作中用到的技术,其次,关注这2年来Android最新的面试题所涉及的知识点,根据自身的实际情况有选择地进行针对性的学习和提升。只有这样,自身才不会被所谓的 互联网寒冬 吓倒。Awesome-Android-Interview搜集了国内一线及二线互联网公司最常出现的面试题,非常全面,笔者花费了很大的精力和时间,希望得到大家的支持。
  • AndroidGuide 这是一份 Android 开发从基础入门到进阶的完整(并不是)指南,所有文章都是本人这几年时间里一字一字码出来的,文章的更新方向和更新频率以我的学习计划为导向,会一直持续密集更新下去…..
  • LearningNotes
  • Android和Flutter笔记文档 基于开源文档Mkdocs部署搭建的学习笔记个人网站
  • BAT大厂Android面试知识点,请客官拿好 年年寒冬,年年也挡不住一个安卓程序员追求大厂的决心。想要进入大厂,我们需要掌握哪些知识点呢?这里,我为大家梳理了一个整体的知识架构。整体包括Java、Android、算法、网络等,并且我也在相应知识点下推荐了与该知识点相关的书籍与博客。希望大家阅读之后,能帮助大家完善与整理自己的知识体系。祝大家早日进入自己理想的公司

面试文献

Java基础

  • Java-Interview 经历BAT面试后总结的【高级Java后台开发面试指南】,纯净干货无废话,针对高频面试点

Android

个人面经

面试题目

跳槽攻略

社区网站篇

arison
版权声明:本站原创文章,由arison2020-12-28发表,共计39940字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)