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命令