「干货」超全Android中高级面试复习大纲,覆盖所有面试知识
liuian 2025-04-01 19:47 22 浏览
文章目录如下:
- Activity面试题
- Fragment面试题
- Service面试题
- Broadcast Receiver面试题
- WebView面试题
- Binder面试题
- Handler面试题
- AsyncTask面试题
- HandlerThread面试题
- IntentService面试题
- 视图工作机制面试题
- 事件分发机制面试题
- ListView面试题
- Android项目构建面试题(由于篇幅太长,今天就先分享到这里)
- ANR面试题
- OOM面试题
- Bitmap面试题
- UI卡顿面试题
- 内存泄漏面试题
- 内存管理面试题
- 冷启动和热启动面试题
- 其他优化面试题
- 架构模式面试题
- 插件化面试题
- 热更新面试题
- 进程保活面试题
- Lint面试题
- Kotlin面试题
Activity面试题
1、Activity是什么
Activity是四大组件之一,它提供一个界面让用户点击和各种滑动操作,这就是Activity
2、Activity四种状态
- runing
- paused
- stopped
- killed
3、Activity生命周期
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onRestart()
4、进程的优先级
- 空进程
- 后台进程
- 服务进程
- 可见进程
- 前台进程
5、Activity任务栈
- 先进后出
6、Activity启动模式
- standard
- singletop
- singletask
- singleinstance
7、scheme跳转协议
Android中的scheme是一种页面内跳转协议,通过定义自己的scheme协议,可以跳转到app中的各个页面
- 服务器可以定制化告诉app跳转哪个页面
- App可以通过跳转到另一个App页面
- 可以通过H5页面跳转页面
Fragment面试题
1、Fragment为什么被称为第五大组件
Fragment比Activity更节省内存,其切换模式也更加舒适,使用频率不低于四大组件,且有自己的生命周期,而且必须依附于Activity
2、Activity创建Fragment的方式
- 静态创建
- 动态创建
3、FragmentPageAdapter和FragmentPageStateAdapter的区别
- FragmentPageAdapter在每次切换页面的的时候,是将Fragment进行分离,适合页面较少的Fragment使用以保存一些内存,对系统内存不会多大影响
- FragmentPageStateAdapter在每次切换页面的时候,是将Fragment进行回收,适合页面较多的Fragment使用,这样就不会消耗更多的内存
4、Fragment生命周期
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
5、Fragment的通信
- Fragment调用Activity中的方法:getActivity
- Activity调用Fragment中的方法:接口回调
- Fragment调用Fragment中的方法:FragmentManager.findFragmentById
6、Fragment的replace、add、remove方法
- replace:替代Fragment的栈顶页面
- add:添加Fragment到栈顶页面
- remove:移除Fragment栈顶页面
Service面试题
1、Service是什么
Service是四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件
2、Service和Thread的区别
- Service是安卓中系统的组件,它运行在独立进程的主线程中,不可以执行耗时操作。Thread是程序执行的最小单元,分配CPU的基本单位,可以开启子线程执行耗时操作
- Service在不同Activity中可以获取自身实例,可以方便的对Service进行操作。Thread在不同的Activity中难以获取自身实例,如果Activity被销毁,Thread实例就很难再获取得到
3、Service启动方式
- startService
- bindService
4、Service生命周期
- startServiceonCreate()onStartCommand()onDestroy()
- bindServiceonCreate()onBind()onUnbind()onDestroy()
Broadcast Receiver面试题
1、Broadcast Receiver是什么
Broadcast是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们的数据
2、Broadcast Receiver的使用场景
- 同一App具有多个进程的不同组件之间的消息通信
- 不同App之间的组件之间的消息通信
3、Broadcast Receiver的种类
- 普通广播
- 有序广播
- 本地广播
- Sticky广播
4、Broadcast Receiver的实现
- 静态注册:注册后一直运行,尽管Activity、进程、App被杀死还是可以接收到广播
- 动态注册:跟随Activity的生命周期
5、Broadcast Receiver实现机制
- 自定义广播类继承BroadcastReceiver,复写onReceiver()
- 通过Binder机制向AMS进行注册广播
- 广播发送者通过Binder机制向AMS发送广播
- AMS查找符合相应条件的广播发送到BroadcastReceiver相应的循环队列中
- 消息队列执行拿到广播,回调BroadcastReceiver的onReceiver()
6、LocalBroadcastManager特点
- 本地广播只能在自身App内传播,不必担心泄漏隐私数据
- 本地广播不允许其他App对你的App发送该广播,不必担心安全漏洞被利用
- 本地广播比全局广播更高效
- 以上三点都是源于其内部是用Handler实现的
WebView面试题
1、WebView安全漏洞
API16之前存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可通过使用Java反射机制利用该漏洞执行任意Java对象的方法
2、WebView销毁步骤
WebView在其他容器上时(如:LinearLayout),当销毁Activity时,需要在onDestroy()中先移除容器上的WebView,然后再将WebView.destroy(),这样就不会导致内存泄漏
3、WebView的jsbridge
客户端和服务端之间可以通过Javascript来互相调用各自的方法
4、WebViewClient的onPageFinished
WebViewClient的onPageFinished在每次完成页面的时候调用,但是遇到未加载完成的页面跳转其他页面时,就会一直调用,使用WebChromeClient.onProgressChanged可以替代
5、WebView后台耗电
在WebView加载页面的时候,会自动开启线程去加载,如果不很好的关闭这些线程,就会导致电量消耗加大,可以采用暴力的方法,直接在onDestroy方法中System.exit(0)结束当前正在运行中的java虚拟机
6、WebView硬件加速
Android3.0引入硬件加速,默认会开启,WebView在硬件加速的情况下滑动更加平滑,性能更加好,但是会出现白块或者页面闪烁的副作用,建议WebView暂时关闭硬件加速
7、WebView内存泄漏
由于WebView是依附于Activity的,Activity的生命周期和WebView启动的线程的生命周期是不一致的,这会导致WebView一直持有对这个Activity的引用而无法释放,解决方案如下
- 独立进程,简单暴力,不过可能涉及到进程间通信(推荐)
- 动态添加WebView,对传入WebView中使用的Context使用弱引用
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2020面试真题解析
Binder面试题
1、Linux内核的基本知识
- 进程隔离/虚拟地址空间:进程间是不可以共享数据的,相当于被隔离,每个进程被分配到不同的虚拟地址中
- 系统调用:Linux内核对应用有访问权限,用户只能在应用层通过系统调用,调用内核的某些程序
- binder驱动:它负责各个用户的进程,通过binder通信内核来进行交互的模块
2、为什么使用Binder
- 性能上,相比传统的Socket更加高效
- 安全性高,支持协议双方互相校验
3、Binder通信模型
- Service服务端通过Binder驱动在ServiceManager的查找表中注册Object对象的add方法
- Client客户端通过Binder驱动在ServiceManager的查找表中找到Object对象的add方法,并返回proxy的add方法,add方法是个空实现,proxy也不是真正的Object对象,是通过Binder驱动封装好的代理类的add方法
- 当Client客户端调用add方法时,Client客户端通过Binder驱动将proxy的add方法,请求ServiceManager来找到Service服务端真正对象的add方法,进行调用
4、AIDL
- 客户端通过aidl文件的Stub.asInterface()方法,拿到Proxy代理类
- 通过调用Proxy代理类的方法,将参数进行封包后,调用底层的transact()方法
- transact()方法会回调onTransact()方法,进行参数的解封
- 在onTransact()方法中调用服务端对应的方法,并将结果返回
Handler面试题
1、Handler是什么
Handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue
2、Handler使用方法
- post(runnable)
- sendMessage(message)
3、Handler工作原理
Android进阶——Android消息机制之Looper、Handler、MessageQueen
4、Handler引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放
解决:
- Handler内部持有外部Activity的弱引用
- Handler改为静态内部类
- Handler.removeCallback()
AsyncTask面试题
1、AsyncTask是什么
它本质上就是一个封装了线程池和Handler的异步框架
2、AsyncTask使用方法
三个参数
- Params:表示后台任务执行时的参数类型,该参数会传给AysncTask的doInBackground()方法
- Progress:表示后台任务的执行进度的参数类型,该参数会作为onProgressUpdate()方法的参数
- Result:表示后台任务的返回结果的参数类型,该参数会作为onPostExecute()方法的参数
五个方法
- onPreExecute():异步任务开启之前回调,在主线程中执行
- doInBackground():执行异步任务,在线程池中执行
- onProgressUpdate():当doInBackground中调用publishProgress时回调,在主线程中执行
- onPostExecute():在异步任务执行之后回调,在主线程中执行
- onCancelled():在异步任务被取消时回调
3、AsyncTask工作原理
- Android进阶——多线程系列之异步任务AsyncTask的使用与源码分析
4、AsyncTask引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放
解决:
- AsyncTask内部持有外部Activity的弱引用
- AsyncTask改为静态内部类
- AsyncTask.cancel()
5、AsyncTask生命周期
在Activity销毁之前,取消AsyncTask的运行,以此来保证程序的稳定
6、AsyncTask结果丢失
由于屏幕旋转、Activity在内存紧张时被回收等情况下,Activity会被重新创建,此时,旧的AsyncTask持有旧的Activity引用,这个时候会导致AsyncTask的onPostExecute()对UI更新无效
7、AsyncTask并行or串行
- AsyncTask在Android 2.3之前默认采用并行执行任务,AsyncTask在Android 2.3之后默认采用串行执行任务
- 如果需要在Android 2.3之后采用并行执行任务,可以调用AsyncTask的executeOnExecutor()
HandlerThread面试题
1、HandlerThread产生背景
当系统有多个耗时任务需要执行时,每个任务都会开启一个新线程去执行耗时任务,这样会导致系统多次创建和销毁线程,从而影响性能。为了解决这一问题,Google提供了HandlerThread,HandlerThread是在线程中创建一个Looper循环器,让Looper轮询消息队列,当有耗时任务进入队列时,则不需要开启新线程,在原有的线程中执行耗时任务即可,否则线程阻塞
2、HanlderThread的特点、
- HandlerThread本质上是一个线程,继承自Thread
- HandlerThread有自己的Looper对象,可以进行Looper循环,可以创建Handler
- HandlerThread可以在Handler的handlerMessage中执行异步方法
- HandlerThread优点是异步不会堵塞,减少对性能的消耗
- HandlerThread缺点是不能同时继续进行多任务处理,需要等待进行处理,处理效率较低
- HandlerThread与线程池不同,HandlerThread是一个串行队列,背后只有一个线程。
IntentService面试题
1、IntentService是什么
IntentService是继承自Service并处理异步请求的一个类,其内部采用HandlerThread和Handler实现的,在IntentService内有一个工作线程来处理耗时操作,其优先级比普通Service高。当任务完成后,IntentService会自动停止,而不需要手动调用stopSelf()。另外,可以多次启动IntentService,每个耗时操作都会以工作队列的方式在IntentService中onHandlerIntent()回调方法中执行,并且每次只会执行一个工作线程
2、IntentService使用方法
- 创建Service继承自IntentService
- 覆写构造方法和onHandlerIntent()方法
- 在onHandlerIntent()中执行耗时操作
视图工作机制面试题
- Android进阶——Android视图工作机制之measure、layout、draw
- Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
ListView面试题
1、ListView是什么
ListView是能将一个数据集合以动态滚动的方式展示到用户界面上的View
2、ListView的RecycleBin机制
3、ListView的优化
- 重用convertView
- 使用ViewHolder
- 图片三级缓存
- 监听滑动事件
- 少用透明View
- 开启硬件加速
Android项目构建面试题
1、android构建流程
2、jenkins持续集成构建
- 这里可参考蒲公英文档
3、Git常用命令
- git init:仓库的初始化
- git status:查看当前仓库的状态
- git diff:查看仓库与上次修改的内容
- git add:将文件放进暂存区
- git commit:提交代码
- git clone:克隆代码
- git bransh:查看当前分支
- git checkout:切换当前分支
4、git工作流
- fork/clone(主流)
- fork:将别人的仓库代码fork到自己的仓库上
- clone:克隆下自己仓库的代码
- update、commit:修改代码并提交到自己的仓库
- push:提交到自己的仓库
- pull request:请求添加到别人的仓库
- clone
5、proguard是什么
ProGuard工具是用于压缩、优化和混淆我们的代码,其主作用是移除或混淆代码中无用类、字段、方法和属性
6、proguard技术功能
- 压缩
- 优化
- 混淆
- 预检测
7、proguard工作原理
将无用的字段或方法存入到EntryPoint中,将非EntryPoint的字段和方法进行替换
8、为什么要混淆
由于Java是一门跨平台的解释性语言,其源代码被编译成class字节码来适应其他平台,而class文件包含了Java源代码信息,很容易被反编译。
最后
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2020BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
Android 基础知识点
Java 基础知识点
Android 源码相关分析
常见的一些原理性问题
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2020面试真题解析
最后,希望大家都能够有自己清晰的发展路线,希望大家都能顺利拿下offer,进入理想的公司,共勉!
以上文章中,所有的文档资料都可以免费分享给大家
需要这些资料的朋友
直接私信我回复【资料】免费领取~
相关推荐
- HR必备Excel函数:4个与日期相关的计算函数。
-
提到日期函数,很多人首先会想到“today”,它可以显示当天的日期,并且每次打开表格时都会自动更新。但是,对于前天、昨天、明天和后天的日期,就不能用yesterday或者tomorrow等这些英文了,...
- 这篇文章有点长,但可以让你十分钟玩转Excel的时间函数
-
日期与时间函数——TODAY、NOW、YEAR、MONTH、DAY!如何用WORKDAY函数查询距离某天的第20个工作日是哪一天?如何用NETWORKDAYS函数查询员工工作了多少个工作日?如何用WE...
- Excel2020年日历套装,表格设计,农历显示,查阅套打轻松应用
-
Hello大家好,我是帮帮。今天跟大家分享一组Excel2020年日历套装,表格设计,自带农历控件,查阅套打轻松应用。有个好消息!为了方便大家更快的掌握技巧,寻找捷径。请大家点击文章末尾的“了解更多”...
- 巧用NETWORKDAYS函数计算两个日期之间工作日的天数
-
带有日期的单元格是我们日常使用EXCEL的时候经常见到的,有的时候我们需要求出两个日期之间间隔的天数,可以直接用结束日期减去开始日期即可,这是个非常简单的减法公式。不过这个单纯的减法公式会默认去掉开始...
- Excel按工作日、休息日进行汇总
-
1、按周六日/其它时间汇总为了区分一周的周六日和其它时间,可以使用WEEKDAY函数,把WEEKDAY函数的第2个参数指定为2,如WEEKDAY(A3,2),则周一返回1,周二返回2,…,周六返回...
- 如何计算每月应出勤天数,如有法定假期和调休,如何计算
-
本文介绍如何计算每月的应出勤天数。第一部分介绍正常双休制下计算应出勤天数;第二部份介绍当月有法定假期和调休的情况下计算应出勤天数。一、计算正常双休制的应出勤天数如下图所示,要求计算各员工2021年3月...
- 《Excel一键生成工作日历:让会议排期更轻松!》
-
每当需要安排会议时,总要翻看日历确认工作日,再逐个标注会议时间,既耗时又容易出错。今天教大家用Excel快速生成工作日历表,让会议排期变得简单高效!一、快速生成日历框架创建基础日期:在A1单元格输入月...
- 如何计算指定日期区间内,有多少工作日和休息日?
-
大家好,今天咱们要解决的问题是如何计算给定的一段日期内,正常工作日有多少天,放假时间有多少天?比如咱们要计算2025年3月份工作日一共有多少天,又有多少天放假,如下图所示:通过肉眼我们可以数清楚,20...
- 如何如何在表格中自动突出显示双休日?
-
现在不少人喜欢用Excel来制作备忘录或安排工作事项。在表格中输入日期后,可以使用条件格式突出显示双休日,避免在休息日安排了工作。具体方法是这样的:第1步:选择要设置条件格式的日期单元格区域;在“开始...
- excel函数技巧:networkdays.intl判断节假日
-
如图,想知道6月的每一天是否是节假日,公式如下:=NETWORKDAYS.INTL(A2,A2,1,$E$2:$E$28)这个函数既可以判断当前日期(一参=二参)是否是周末及工作日(三参、四参)还可得...
- 仅需3步,让考勤表根据实际休息日,自动地填充颜色
-
Hello,大家好,之前跟大家分享了我们如何让考勤表根据单休与双休自动的填充颜色,最近有粉丝问到:能不能让考勤表根据实际的休息日自动的填充颜色呢?可以是可以,只不过因为牵扯到假期调休,我们每年的休息日...
- 5步搞定动态考勤表!标记节假日、调休日?Excel自动变色!
-
今天教你用「动态考勤表」一招解决所有问题!只需输入月份,自动变色、自动更新节假日,从此告别加班,效率翻倍!动态考勤表的优势:自动变色:节假日、双休日一键标记,颜色分明。一表多用:修改月份即可...
- 一起用python做个炫酷音乐播放器,想听啥随便搜
-
前言前段时间写的Python自制一款炫酷音乐播放器,有不少小伙伴私信我,对播放器提了不少改进建议,让我完善播放器的功能。今天音乐播放器2.0版本完成了,大家一起来看看是如何用python自制一款炫酷的...
- 用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)
-
桌面太单调?今天就带大家,一起用Python的PyQt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果!下面,我们开始介绍这个自定义桌面动画挂件的制作过程。一、核心功能设计实现将动态图gif...
- Python串口调试助手源码分享
-
以下是一个基于Python和PyQt5实现的串口调试助手示例,包含核心功能实现代码:pythonimportsysimportserialfromPyQt5.QtCoreimportQTim...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- react-admin (33)
- vscode切换git分支 (35)
- vscode美化代码 (33)
- python bytes转16进制 (35)