缘起
有不少Android 开发人员准备面试,殊不知道如何准备?因而纷纷上网发帖求助。css
甚至不少人网上随便找找面试题什么的,其结果就是[字节惨挂在三面],挥泪整理面筋。等诸多文章火了,究其缘由就是这些文章戳中了大部分面试者的痛点,面试被刷了。html
想到还有不少android程序员没有找到Android面试大纲。不知道如何准备Android面试。java
因而,我就想干脆我本身作这个事吧,就算没人看,也当我本身的年终总结了。linux
纯技术方面的准备,若是是的话,我就提供一些拙见,大部分算是一些开发知识死角或者tips吧,权当抛砖引玉了:)
今天就总结下2020年搜集整理的面试题,难度不大,大佬能够直接路过,固然发发善心点个赞也是能够的❤️。android
一、Activity是什么git
Activity是四大组件之一,它提供一个界面让用户点击和各类滑动操做,这就是Activity程序员
二、Activity四种状态web
三、Activity生命周期面试
四、Activity切换横屏时生命周期shell
五、进程的优先级
oom_adj
是linux内核分配给每一个系统进程的一个值,表明进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。进程的oom_adj
越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收。普通app进程的oom_adj
>=0,系统进程的oom_adj
才可能小于0。进程优先级从小到大以下
六、Activity任务栈
七、Activity启动模式
八、scheme跳转协议
android中的scheme是一种页面内跳转协议,经过定义本身的scheme协议,能够跳转到app中的各个页面
九、Context、Activity、Application之间有什么区别
Activity和Application都是Context的子类。Context从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的总用,方便咱们能够简单的访问到各类资源。虽然Activity和Application都是Context的子类,可是他们维护的生命周期不同。前者维护一个Acitivity的生命周期,因此其对应的Context也只能访问该activity内的各类资源。后者则是维护一个Application的生命周期
十、Activity启动过程
startActivitySately()
,而这个方法内部则是调用startActivty()
,startActivity()
最终仍是会调用startActivityForResult()
。因为startActivityForResult()
是有返回结果的,系统直接返回-1,表示不须要返回结果startActivityForResult()
经过Instrumentation类中的execStartActivity()
来启动activity,Instrumentation这个类主要做用是监控程序和系统之间的交互。在这个execStartActivity()
中会获取ActivityManagerService的代理对象,经过这个代理对象进行启动activityApplicationThread.scheduleLaunchActivity()
进行启动activity,在这个方法中建立一个ActivityClientRecord对象,用来记录启动Activity组件的信息,而后经过handler将ActivityClientRecord发送出去ActivityThread.handleLaunchActivity()
启动Activity十一、简述Activity,View,Window三者关系
一、Fragment为何被称为第五大组件
Fragment比Activity更节省内存,其切换模式也更加温馨,使用频率不低于四大组件,且有本身的生命周期,并且必须依附于Activity
二、Activity建立Fragment的方式
三、FragmentPageAdapter和FragmentPageStateAdapter的区别
四、Fragment生命周期
五、Fragment的通讯
六、Fragment的replace、add、remove方法
一、Service是什么
Service是四大组件之一,它能够在后台执行长时间运行操做而没有用户界面的应用组件
二、Service和Thread的区别
三、Service启动方式
四、Service生命周期
一、Broadcast Receiver是什么
Broadcast是四大组件之一,是一种普遍运用在应用程序之间传输信息的机制,经过发送Intent来传送咱们的数据
二、Broadcast Receiver的使用场景
三、Broadcast Receiver的种类
四、Broadcast Receiver的实现
五、Broadcast Receiver实现机制
六、LocalBroadcastManager特色
一、WebView安全漏洞
二、WebView销毁步骤
三、WebView的jsbridge
四、WebViewClient的onPageFinished
五、WebView后台耗电
六、WebView硬件加速
Android3.0引入硬件加速,默认会开启,WebView在硬件加速的状况下滑动更加平滑,性能更加好,可是会出现白块或者页面闪烁的反作用,建议WebView暂时关闭硬件加速
七、WebView内存泄漏
因为WebView是依附于Activity的,Activity的生命周期和WebView启动的线程的生命周期是不一致的,这会致使WebView一直持有对这个Activity的引用而没法释放,解决方案以下
一、Linux内核的基本知识
二、为何使用Binder
三、Binder通讯原理
四、AIDL
五、BpBinder和BBinder
BpBinder(客户端)对象和BBinder(服务端)对象,它们都从IBinder类中派生而来,BpBinder(客户端)对象是BBinder(服务端)对象的代理对象,关系图以下
一、Handler是什么
Handler经过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue
二、Handler使用方法
三、Handler工做原理
四、Handler引发的内存泄漏
解决:
一、AsyncTask是什么
它本质上就是一个封装了线程池和Handler的异步框架
二、AsyncTask使用方法
三个参数
五个方法
三、AsyncTask工做原理
四、AsyncTask引发的内存泄漏
解决:
五、AsyncTask生命周期
在Activity销毁以前,取消AsyncTask的运行,以此来保证程序的稳定
六、AsyncTask结果丢失
因为屏幕旋转、Activity在内存紧张时被回收等状况下,Activity会被从新建立,此时,旧的AsyncTask持有旧的Activity引用,这个时候会致使AsyncTask的onPostExecute()对UI更新无效
七、AsyncTask并行or串行
一、HandlerThread产生背景
当系统有多个耗时任务须要执行时,每一个任务都会开启一个新线程去执行耗时任务,这样会致使系统屡次建立和销毁线程,从而影响性能。为了解决这一问题,Google提供了HandlerThread,HandlerThread是在线程中建立一个Looper循环器,让Looper轮询消息队列,当有耗时任务进入队列时,则不须要开启新线程,在原有的线程中执行耗时任务便可,不然线程阻塞
二、HanlderThread的特色、
一、IntentService是什么
IntentService是继承自Service并处理异步请求的一个类,其内部采用HandlerThread和Handler实现的,在IntentService内有一个工做线程来处理耗时操做,其优先级比普通Service高。当任务完成后,IntentService会自动中止,而不须要手动调用stopSelf()。另外,能够屡次启动IntentService,每一个耗时操做都会以工做队列的方式在IntentService中onHandlerIntent()回调方法中执行,而且每次只会执行一个工做线程
二、IntentService使用方法
一、Android构建流程
[图片上传失败…(image-ccd96b-1606878198554)]
二、jenkins持续集成构建
三、git经常使用命令
四、git工做流
fork/clone(主流)
五、proguard是什么
ProGuard工具是用于压缩、优化和混淆咱们的代码,其主做用是移除或混淆代码中无用类、字段、方法和属性
六、proguard技术功能
七、proguard工做原理
将无用的字段或方法存入到EntryPoint中,将非EntryPoint的字段和方法进行替换
八、为何要混淆
因为Java是一门跨平台的解释性语言,其源代码被编译成class字节码来适应其余平台,而class文件包含了Java源代码信息,很容易被反编译
九、annotationProcessor与compileOnly的区别
annotationProcessor与compileOnly都是只编译并不打入apk中
一、什么是ANR
Application Not Responding,页面无响应的对话框
二、发生ANR的条件
应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件知足时,就会弹出ANR的对话框
三、形成ANR的主要缘由
主线程被IO操做阻塞
四、如何解决ANR
一、什么是OOM
OOM指Out of memory(内存溢出),当前占用内存加上咱们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常
二、OOM相关概念
三、解决OOM
Bitmap相关
其余相关
一、recycle
二、LruCache原理
LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中
三、计算采样率
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { if (width > height) { inSampleSize = Math.round((float)height / (float)reqHeight); } else { inSampleSize = Math.round((float)width / (float)reqWidth); } } return inSampleSize; }
四、采样率压缩(缩略图)
public static Bitmap thumbnail(String path,int maxWidth, int maxHeight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(path, options); options.inJustDecodeBounds = false; int sampleSize = calculateInSampleSize(options, maxWidth, maxHeight); options.inSampleSize = sampleSize; options.inPreferredConfig = Bitmap.Config.RGB_565; options.inPurgeable = true; options.inInputShareable = true; if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); } bitmap = BitmapFactory.decodeFile(path, options); return bitmap; }
五、质量压缩
public static String save(Bitmap bitmap,Bitmap.CompressFormat format, int quality, File destFile) { try { FileOutputStream out = new FileOutputStream(destFile); if (bitmap.compress(format, quality, out)) { out.flush(); out.close(); } if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); } return destFile.getAbsolutePath(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
六、尺寸压缩
public static void reSize(Bitmap bmp,File file,int ratio){ Bitmap result = Bitmap.createBitmap(bmp.getWidth()/ratio, bmp.getHeight()/ratio,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); RectF rect = new RectF(0, 0, bmp.getWidth()/ratio, bmp.getHeight()/ratio); canvas.drawBitmap(bmp, null, rect , null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); result.compress(Bitmap.CompressFormat.JPEG, 100, baos); try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
七、保存到SD卡
public static String save(Bitmap bitmap,Bitmap.CompressFormat format, int quality, Context context) { if (!Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)) { return null; } File dir = new File(Environment.getExternalStorageDirectory() + "/" + context.getPackageName() + "/save/"); if (!dir.exists()) { dir.mkdirs(); } File destFile = new File(dir, UUID.randomUUID().toString()); return save(bitmap, format, quality, destFile); }
八、三级缓存
九、NDK压缩
Android进阶——图片优化之质量压缩、尺寸压缩、采样率压缩、LibJpeg压缩
十、webp压缩
Android Webp 彻底解析 快来缩小apk的大小吧-鸿洋的博客
一、UI卡顿原理
View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),若是安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象
二、UI卡顿的缘由分析
三、UI卡顿的优化
布局优化
ListView优化
背景和图片优化
避免ANR
一、Java内存泄漏引发的主要缘由
长生命周期的对象持有短生命周期对象的引用就极可能发生内存泄漏
二、Java内存分配策略
三、Android解决内存泄漏的例子
一、Android内存管理机制
二、内存管理机制的特色
三、内存优化方法
一、什么是冷启动和热启动
二、冷启动和热启动的区别
三、冷启动时间的计算
这个时间值从应用启动(建立进程)开始计算,到完成视图的第一次绘制为止
四、冷启动流程
总结:点击App->IPC->Process.start->ActivityThread->Application生命周期->Activity生命周期->ViewRootImpl测量布局绘制显示在界面上
五、冷启动优化
六、adb命令获取启动时间
adb shell am start -W packagename/MainActivity
一、Android不用静态变量存储数据
二、SharePreference安全问题
三、内存对象序列化
四、避免在UI线程中作繁重的操做
一、插件化解决的问题
二、类加载器(Java中字节码添加到虚拟机中)
一、热更新主要流程
二、热更新主流框架
三、热更新的原理
一、进程的优先级
二、Android进程回收策略
三、Android保活方案
一、什么是Android Lint
Android Lint是一个静态代码分析工具,它可以对你的Android项目中潜在的Bug、可优化的代码、安全性、性能、可用性、可访问性、国际化等进行检查
二、Lint工做流程
[图片上传失败…(image-d5f5ab-1606878198551)]
三、配置Lint
一、什么是Kotlin
二、Kotlin环境搭建
一、Dalvik与JIT
Dalvik是Android虚拟机,JIT则是Dalvik采用的技术策略
在编译打包APK文件时,会通过如下流程Java->Class->Dalvik字节码(dex)->每次执行代码都要编译成机器码->交给底层处理
,这样处理起来效率低下,经过引入JIT(即时编译技术),当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行即时编译,通过编译后的代码,会被优化成至关精简的原生型指令码,这样在下次执行到相同逻辑的时候,速度就会更快。但因为每次启动App都须要即时编译,致使运行时耗电量大
二、ART与AOT
ART是Android虚拟机,AOT则是ART采用的技术策略
在ART环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用,这一技术称为AOT。以后打开App的时候,不须要额外的翻译工做,直接使用本地机器码运行,所以运行速度提升。但因为会预先编译,安装时间不免会延长,并且会消耗更多的存储空间,但消耗掉空间的增幅一般不会超过应用代码包大小的20%
三、发展史
四、JVM与Dalvik不一样
五、Dalvik与ART不一样
一、什么是Annotation
Java提供的一种元程序中的元素关联任何信息和任何元数据(metadata)的途径和方法
二、什么是metadata
三、注解分类
系统内置标准注解
元注解
@Target
@Retention
生命周期
四、注解声明
注解支持填写数组,同时支持多种范围
@Target({ElementType.TYPE,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModuleWrapper {}
五、Android Support Annotation
六、注解的用途
1)过程分析:主要分为三步
DNS解析
。用户输入url后,须要经过DNS解析找到域名对应的ip地址,有了ip地址才能找到服务器端。首先会查找浏览器缓存,是否有对应的dns记录。再继续按照操做系统缓存—路由缓存—isp的dns服务器—根服务器的顺序进行DNS解析,直到找到对应的ip地址。客户端(浏览器)和服务器交互
。浏览器根据解析到的ip地址和端口号发起HTTP请求,请求到达传输层,这里也就是TCP层,开始三次握手创建链接。服务器收到请求后,发送相应报文给客户端(浏览器),客户端收到相应报文并进行解析,获得html页面数据,包括html,js,css等。客户端(浏览器)解析html数据
,构建DOM树,再构造呈现树(render树),最终绘制到浏览器页面上。2)其中涉及到TCP/IP协议簇,包括DNS,TCP,IP,HTTP协议等等。
TCP/IP通常指的是TCP/IP协议簇,主要包括了多个不一样网络间实现信息传输涉及到的各类协议
主要包括如下几层:
应用层
:主要提供数据和服务。好比HTTP,FTP,DNS等传输层
:负责数据的组装,分块。好比TCP,UDP等网络层
:负责告诉通讯的目的地,好比IP等数据链路层
:负责链接网络的硬件部分,好比以太网,WIFI等客户端简称A,服务器端简称B
1)TCP创建链接须要三次握手
syn
包,A进入SYN_SENT
状态)syn
包,须要确认syn
包,而且本身也发送一个syn
包,即发送了syn+ack
包,B进入SYN_RECV
状态)syn+ack
包,向服务器发送确认包ack
,AB进入established
状态)开始链接。2)TCP断开链接须要四次挥手
fin
,进入FIN_WAIT_1
状态)CLOSE_WAIT
状态)LAST_ACK
状态)close
d状态)3)为何挥手多一次
其实正常的断开和链接都是须要四次
:
可是链接中,第二步和第三步是能够合并
的,由于链接以前A和B是无联系的,因此没有其余状况须要处理。而断开的话,由于以前两端是正常链接状态,因此第二步的时候不能保证B以前的消息已经发送完毕,因此不能立刻告诉A要断开的消息。这就是链接为何能够少一步的缘由。
4)为何链接须要三次,而不是两次。
正常来讲,我给你发消息,你告诉我能收到,不就表明咱们以前通讯是正常的吗?
TCP是双向通讯协议
,若是两次握手,不能保证B发给A的消息正确到达。TCP 协议为了实现可靠传输, 通讯双方须要判断本身已经发送的数据包是否都被接收方收到, 若是没收到, 就须要重发。
TCP是怎么保证可靠传输的?
序列号和确认号
。好比链接的一方发送一段80byte数据,会带上一个序列号,好比101。接收方收到数据,回复确认号181(180+1),这样下一次发送消息就会从181开始发送了。因此握手过程当中,好比A发送syn信号给B,初始序列号为120,那么B收到消息,回复ack
消息,序列号为120+1。同时B发送syn
信号给A,初始序列号为256,若是收不到A的回复消息,就会重发,不然丢失这个序列号,就没法正常完成后面的通讯了。
这就是三次握手的缘由。
TCP
提供的是面向链接,可靠的字节流服务。即客户和服务器交换数据前,必须如今双方之间创建一个TCP链接(三次握手),以后才能传输数据。而且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。
UDP
是一个简单的面向数据报的运输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,可是不能保证它们能到达目的地。因为UDP
在传输数据报前不用再客户和服务器之间创建一个链接,且没有超时重发等机制,因此传输速度很快。
因此总结下来就是:
能够看到TCP
适用于稳定的应用场景,他会保证数据的正确性和顺序,因此通常的浏览网页,接口访问都使用的是TCP
传输,因此才会有三次握手
保证链接的稳定性。
而UDP是一种结构简单的协议,不会考虑丢包啊,创建链接等。优势在于数据传输很快,因此适用于直播,游戏等场景。
常见的有四种:
GET
获取资源,没有body,幂等性POST
增长或者修改资源,有bodyPUT
修改资源,有body,幂等性DELETE
删除资源,幂等性1)请求报文:
//请求行(包括method、path、HTTP版本) GET /s HTTP/1.1 //Headers Host: www.baidu.com Content-Type: text/plain //Body 搜索****
2)响应报文
//状态行 (包括HTTP版本、状态码,状态信息) HTTP/1.1 200 OK //Headers Content-Type: application/json; charset=utf-8 //Body [{"info":"xixi"}]
3)经常使用状态码
主要分为五种类型:
1开头
, 表明临时性消息,好比100(继续发送)2开头
, 表明请求成功,好比200(OK)3开头
, 表明重定向,好比304(内容无改变)4开头
, 表明客户端的一些错误,好比403(禁止访问)5开头
, 表明服务器的一些错误,好比500文档领取方式:点赞+关注,而后私信关键词 【1】便可得到免费领取方式!