编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 测试经验
  • 职场提升
  • 技术模版

Android问题汇总

目录介绍

  • 01.四大组件问题汇总
  • 02.View工作原理问题
  • 03.Android事件体系问题
  • 04.Android消息机制
  • 05.Android多线程问题
  • 07.Android动画机制
  • 08.Android多媒体问题
  • 09.Android网络相关
  • 10.Android数据相关问题
  • 11.WebView相关问题
  • 12.JetPack相关问题
  • 13.Android编译问题
  • 14.控件相关问题汇总
  • 15.Android进程IPC
  • 16.其他各类问题汇总
  • 17.项目架构相关问题

01.四大组件问题汇总

  • App进程:说一下App进程启动流程?Zygote进程的启动流程是什么样的?关于Zygote进程主要做了那些事情?
  • App进程:SystemServer进程启动流程是什么样的?怎么创建单个进程(application)?如何启动ActivityThread?
  • 启动入口:ActivityThread启动入口做了什么?如何创建上下文?为什么要创建上下文。说一下主线程创建时机?
  • 启动流程:说一下application的启动流程,何时创建,什么时候调用onCreate和attachBaseContext方法?
  • 启动顺序:Application中attachBaseContext方法,onCreate方法和ContentProvider中的onCreate方法执行的顺序是什么?
  • Activity启动流程:其中考察最多的类似问题是:从桌面点击一个图标之后,到界面显示,这个过程发生了什么?
  • Activity启动模式:也就是常见的四种启动模式,面试官更喜欢问何时使用他们,也就是使用场景。从非activity中开启activity为什么要添加flag,不添加会出现什么问题?
  • Activity生命周期:onStart()和onResume()/onPause()和onStop()的区别?并且这几个方法在那种场景下用到,具体有什么作用?
  • Activity异常生命周期:简单说一下这些方法是做什么用的?onSaveInstanceState()方法?何时会调用?onSaveInstanceState()与onPause()的区别?如何避免配置改变时Activity重建?
  • Activity#onNewIntent:onNewIntent()调用时机?onNewIntent()具体有什么作用?Activity遵循什么设计模式?知道ActivityThread这个类是干什么用的吗?
  • Service:Activity如与Service通信?Service的生命周期与启动方法由什么区别?Service先start再bind如何关闭service,为什么bindService可以跟Activity生命周期联动?
  • Service:一个Activity先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destroy()方法?
  • Service前台服务:前台服务是什么?和普通服务的不同?如何去开启一个前台服务?如何去做保活?
  • Service绑定服务:bindService是一个异步的过程吗?绑定service大概需要经历那些过程?是否能在Service进行耗时操作?
  • Receiver:广播有哪些注册方式?有什么区别?广播发送和接收原理是什么?广播传输的数据是否有限制,是多少,为什么要限制?
  • BroadcastReceiver:广播原理是什么?如何进行数据传递?广播跨进程实现的方案是什么?
  • Receiver案例分析:BroadcastReceiver与LocalBroadcastReceiver有什么区别?LocalBroadcastReceiver 是应用内广播,那么它是怎么实现的?
  • Receiver案例分析:如何通过广播拦截和abort一条短信;广播是否可以请求网络;广播引起anr的时间限制?广播中怎么进行网络请求?
  • ContentProvider:为什么会设计ContentProvider,ContentProvider 是如何实现数据共享的?请说一下进程共享和线程安全问题……
  • ContentProvider:说一下初始化流程,简单说一下ContentProvider的权限管理(读写分离,权限控制-精确到表级,URL控制)
  • Fragment原理:Fragment设计原理是什么?replace和add的区别?用Fragment有遇过什么坑吗,怎么解决 ?
  • Fragment案例:Fragment是如何做懒加载的?有那几个重要的方法?如何实现?setUserVisibleHint()方法什么时候调用?
  • Fragment分析:如果在onStop的时候做了网络请求,onResume的时候怎么恢复?
  • Fragment案例:在fragment中为什么有时getActivity()会为null?Fragment试图为什么有的时候会重叠,怎么产生的,又如何解决?

02.View工作原理问题

  • View刷新:requestLayout、invalidate与postInvalidate作用与区别,在requestLayout这个方法里面做了什么?
  • View刷新:requestLayout,onLayout,onDraw,DrawChild区别与联系?drawChild()是做什么用的?View是如何绘制到屏幕上的?
  • Canvas:Canvas.save()跟Canvas.restore()的调用时机?Canvas的底层机制,绘制框架,硬件加速是什么原理,canvas lock的缓冲区是怎么回事
  • View绘制流程,当一个TextView的实例调用setText()方法后执行了什么?请说一下原理……
  • 测量:如何理解View中的测量?子控件的测量依赖父布局约束吗?如何理解测量过程中的"递"和"归"的设计思想?
  • 测量:如何理解测量中布局MeasureSpec的设计?mode三种布局模式分别如何理解?mode和size的组成如何理解?
  • 测量:单个控件测量流程是怎么样的?测量策略是如何影响测量结果的?如何标记测量完成?谈一下设计思想?
  • 测量:完整的View树测量流程的设计思路是什么样的?遍历测量孩子的大小如何处理margin和padding逻辑?
  • 布局:getWidth()方法和getMeasureWidth()区别呢?布局的设计思路是什么?
  • 布局:单个View的布局流程是怎么样的?如何理解布局中相对位置和绝对位置?什么情况下需要对控件重新布局?
  • 布局:以LinearLayout为例,完整布局流程是怎么样的。如果其中的一个孩子View修改了top高度,其布局流程会发生什么变化?
  • 绘制:在View中draw绘制思路是如何设计的?ViewGroup中dispatchDraw分发绘制设计思路是怎样的?
  • 绘制:说一下绘制中surface起到什么作用?draw里面绘制了那些东西,简要介绍一下?

03.Android事件体系问题

  • 事件分发流程:考察得最多,基本把整个分发流程讲清楚就好了;其次还会考察如何解决具体的冲突场景。
  • 事件体系设计思想:事件体系设计思想是什么?事件分发的本质?事件在哪些对象间进行传递?事件流程?
  • 事件拦截:点击事件被拦截,但是想传到下面的View,如何操作?事件传递流程是什么?主要有哪些方法,请说一下这些方法的作用……
  • 事件分发:事件分发中的onTouch 和onTouchEvent 有什么区别,又该如何使用?事件传递流程和OnTouchListener的关系,那个先执行?
  • 返回键事件:说一下返回键事件分发流程?如何从Native层传输到应用层,说一下事件传递的流程。

04.Android消息机制

  • Handler工作流程:比如怎么唤醒主线程的,while为啥不会阻塞主线程。同步屏障。涉及到绘制优化、屏幕刷新机制等。
  • 阻塞唤醒原理:这里一般是会问为何loop()方法是死循环却不会占用cpu时间片 or 为何next()方法阻塞却不会卡死。更深一点会问到Linux的IO多路复用epoll原理。
  • 异步消息:说下handler的流程,异步消息是什么?Android中哪些场景会发送异步消息?我们在代码中可以手动发异步消息吗?
  • ThreadLocal:Handler为何用ThreadLocal?它是如何存储数据的?为何多线程需要使用到它?什么场景会用到ThreadLocal?
  • 消息机制:postDelay中是如何处理延迟消息的?如何阻塞挂起?

05.Android多线程问题

  • 多线程:Android中为什么要使用多线程,说下多线程?多个线程如何同步请求,返回的结果如何等待所有线程数据完成后合成一个数据?
  • 场景面试题:如果我开了 18 个子线程,同时发送,并发的情况下如何保证消息及时性?
  • AsyncTask:AsyncTask机制说一下……如何取消AsyncTask?并且它存在哪些不足?AsyncTask生命周期随着activity销毁而销毁吗?AsyncTask如何造成内存泄漏?
  • IntentService:你觉得使用 IntentService 和自己写一个异步加载有什么区别吗?IntentService原理是什么?
  • 场景面试题:线程池的核心参数。如果core为5,提交了三个任务,分别被三个线程执行了,其中一个任务提前执行完毕了,此时再提交一个任务,这个任务是如何执行的?

07.Android动画机制

  • 常见的动画有哪些?具体有哪些使用场景?动画的两种实现:setX跟setTranslationX区别?
  • Animation动画框架实现原理?动画可以改变相应的事件和位置吗?为什么?差值器和估值器是做什么用的?
  • 补间动画和属性动画,对于作用于View,两者有什么区别?属性动画是如何改变View的属性的?

08.Android多媒体问题

  • 图片加载:怎么加载一张超大图?如何计算内存大小?加载大图如何避免OOM,平常是怎么压缩图片的?如何加载超高清大图,局部加载图片了解嘛?
  • 圆角:如何给控件的背景设置圆角。做图片圆角的原理是什么,平常有哪些优化操作?
  • Drawable:对比使用图片和drawable的好处,以及drawable的原理。不同文件展示会一样嘛?同样图片不同文件展示会一样嘛?
  • svg图片:svg 为什么体积会比较小?为什么是可伸缩的?是否可以无损缩放?svg 是否可以放一张照片,为什么?
  • Luban:压缩具体实现原理,可以自己写吗?Luban 压缩如何保证压缩的同时,图片质量还清晰?
  • 多媒体:为什么限制在应用间共享文件?作为进程间的共享相册文件,是如何进行跨进程读取的?

09.Android网络相关

  • 请求:数据层有统一的管理么,数据缓存是怎么做的,http请求等有提供统一管理么?
  • 缓存:网络请求缓存处理,okHttp如何处理网络缓存的?缓存拦截器中做了什么逻辑?
  • 数据有序:服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达?
  • 网络请求:https请求如何保证安全性?Charles能抓https请求么?能抓的话那安全性在哪?app如何防止代理抓包?

10.Android数据相关问题

  • SharePreference性能优化,可以做进程同步吗?SharedPreferences的应用场景,核心原理是什么?SharedPreferences是线程安全的吗?
  • SharedPreferences:两种提交方式,缺点,如何解决?主要是commit和apply的区别?
  • Android如何在不压缩的情况下加载高清大图?Android里的内存缓存和磁盘缓存是怎么实现的。
  • android里面的两种序列化方式,如何实现的。Android为什么引入Parcelable?怎么实现的?有没有尝试简化Parcelable的使用?
  • 什么是序列化,序列化的对象设置一个serialVersionUID有什么作用?Serializable和Parcelable在性能上那个更加高效,具体结合案例说说……
  • 序列化:serializable和parcelable的原理,以及各自的优缺点、应用场景。

11.WebView相关问题

  • WebView优化了解吗,如何提高WebView的加载速度?Java和JS的相互调用怎么实现,有做过什么优化吗?
  • WebView内存泄露出现的原因,该如何解决?怎么样提高webView加载速度?
  • WebView的内核是什么,4.4后直接使用了Chrome,那么Chrome又有哪些好处呢?
  • js调用native方法,它底层的原理是什么?为什么js能调用到Java的方法?webkit提供了这个功能,那它是怎么实现的?js调用native的方法时,是同步的还是异步的?java方法return一个值,js那边能立即拿到么?通过js调用一个java方法,这个java方法都是@onJavaInterface注解过的,这个方法是运行在哪个线程?

12.JetPack相关问题

  • LiveData:连续set两个相同的数据,会收到几次;连续post两个相同的数据,会收到几次;liveData能在子线程接收么?
  • LiveData:核心设计思想是什么?如何实现双向绑定。View 到 Model,Model 到 View 如何实现绑定?
  • LiveData:连续三次postValue数据,
  • ViewModel:如何实现Activity旋转之后,依旧能恢复数据的,如何保证model不变?ViewModel 如何绑定不同的页面?ViewModel 是单向绑定还是双向绑定?
  • ViewModel:是怎么和 View 之间怎么绑定的?充当业务逻辑层,如果两个模块逻辑一样,只是 UI 不一样,如何保证复用?如何实现ViewModel单利对象?

13.Android编译问题

  • gradle生命周期,怎么自定义插件?统计编译耗时插件,运行在哪个阶段?
  • 描述从编译到apk的过程,以及gradle有哪些task参与其中?
  • implementation 和 api的区别是什么?

14.控件相关问题汇总

  • SurfaceView和View的最本质的区别?SurfaceView为什么不会造成画面卡顿?它底部是如何实现的?
  • ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化
  • 说一下RecyclerView绘制步骤和复用机制,复用机制底层是用什么数据结构?聊聊RecyclerView,动画,缓存,数据绑定底层是如何实现的。如何自己实现RecyclerView的侧滑删除?
  • 加载xml和动态创建view哪个高效?为什么加载xml效率低?
  • TextView 中 setText(Html.fromHtml()) 内部原理知道吗?
  • SurfaceView, TextureView及View的区别。SurfaceView怎么控制它处于的层级。
  • Activity、Dialog、PopupWindow、Toast 与Window的关系?

15.Android进程IPC

  • 跨进程:常见的跨进程通信方式,AIDL的实现原理?AIDL解决了什么问题?AIDL如何使用?多进程场景遇见过么?谈谈对进程共享和线程安全的认识……
  • Binder:为什么会有Binder?设计思想是什么?不在同一个进程中的Activity和Service(比如把服务定义成一个独立进程)是如何通信的?
  • Binder:进程通信有共享内存,管道,socket,消息队列。他们的原理大概都是什么样的?Binder中使用mmap是什么东西?
  • IPC:既然有现有的IPC方式,为什么重新设计一套Binder机制呢。是否用Binder中mmap思想解决你的APP卡顿问题?
  • Binder机制:ServiceManager什么时候注册的?这个是用来干嘛的?Binder内核所在的进程是如何找到到Server跟Client进行通信的?

16.其他各类问题汇总

  • 有没有接触过Socket编程,简单说下代码实现。
  • Android9 10 11 都更新了什么新特性,新版本中无法获取IMEI怎么处理。
  • 如果设计一个App的启动框架,需要考虑什么问题,怎么处理同步异步的加载任务调度。
  • 描述一下冷启动的过程。冷启动就是在 Launcher 进程中开启另一个引用 Activity 的过程。
  • 说一下apk打包流程,apk安装流程,说一下apk如何减小体积的方法?
  • 从点击应用图标到进入应用,Android系统都做了哪些工作,期间涉及到的进程切换有哪些?
  • Android里的Intent传递的数据有大小限制吗,如何解决?intent和bundle有什么区别,intent常见的传递类型有哪些?
  • 说下你对多进程的理解,什么情况下要使用多进程,为什么要使用多进程,在多进程的情况下为什么要使用进程通讯

17.项目架构相关问题

  • 介绍一下MVC,MVP,MVVM,你们项目用的是哪个?
  • 对组件化的理解,你们是怎么实现组件化的?功能模块之间互相引用会有什么问题?

18.性能测试

  • 客户端如何做测试?App压力测试如何做?
  • 客户端测试:FPS,内存,CPU
    • CPU:
    • FPS: — 内存:腾讯profilerDog,打开开发者模式,可以收集app的内存,网络等数据。
  • 收集cpu数据
    • 通过adb命令
贡献者: yangchong211