安卓面试一面试

稳了,金三银四就靠它了,Android全网最全面试题解析(附答案

2021-01-27  本文已影响0人  Android阿南

缘起
有很多Android 开发人员准备面试,却不知道如何准备?于是纷纷上网发帖求助。

甚至很多人网上随便找找面试题什么的,其结果就是[字节惨挂在三面],挥泪整理面筋。等诸多文章火了,究其原因就是这些文章戳中了大部分面试者的痛点,面试被刷了。

想到还有很多android程序员没有找到Android面试大纲。不知道如何准备Android面试。

于是,我就想干脆我自己做这个事吧,就算没人看,也当我自己的年终总结了。

如何准备android面试

纯技术方面的准备,如果是的话,我就提供一些拙见,大部分算是一些开发知识死角或者tips吧,权当抛砖引玉了:)
今天就总结下2020年搜集整理的面试题,难度不大,大佬可以直接路过,当然发发善心点个赞也是可以的❤️。

Activity面试题


1、Activity是什么

Activity是四大组件之一,它提供一个界面让用户点击和各种滑动操作,这就是Activity

2、Activity四种状态

3、Activity生命周期

4、Activity切换横屏时生命周期

5、进程的优先级

oom_adj是linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。进程的oom_adj越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收。普通app进程的oom_adj>=0,系统进程的oom_adj才可能小于0。进程优先级从小到大如下

6、Activity任务栈

7、Activity启动模式

8、scheme跳转协议

android中的scheme是一种页面内跳转协议,通过定义自己的scheme协议,可以跳转到app中的各个页面

9、Context、Activity、Application之间有什么区别

Activity和Application都是Context的子类。Context从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。虽然Activity和Application都是Context的子类,但是他们维护的生命周期不一样。前者维护一个Acitivity的生命周期,所以其对应的Context也只能访问该activity内的各种资源。后者则是维护一个Application的生命周期

10、Activity启动过程

  1. 在安装应用的时候,系统会启动PackaManagerService管理服务,这个管理服务会对AndroidManifest进行解析,从而得到应用程序中的相关信息,比如service,activity,Broadcast等等,然后获得相关组件的信息
  2. 当用户点击应用图标时,就会调用startActivitySately(),而这个方法内部则是调用startActivty()startActivity()最终还是会调用startActivityForResult()。由于startActivityForResult()是有返回结果的,系统直接返回-1,表示不需要返回结果
  3. startActivityForResult()通过Instrumentation类中的execStartActivity()来启动activity,Instrumentation这个类主要作用是监控程序和系统之间的交互。在这个execStartActivity()中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity
  4. 在ActivityManagerService的代理对象中,通过Binder通信,调用到ApplicationThread.scheduleLaunchActivity()进行启动activity,在这个方法中创建一个ActivityClientRecord对象,用来记录启动Activity组件的信息,然后通过handler将ActivityClientRecord发送出去
  5. 在handler收到消息后,调用ActivityThread.handleLaunchActivity()启动Activity

11、简述Activity,View,Window三者关系

  1. Activity本质是上下文,View本质是视图,Window本质是窗口
  2. Activity构造的时候会初始化一个Window,其具体实现是PhoneWindow
  3. PhoneWindow中有一个ViewRoot(View或ViewGroup),是最初始的根视图
  4. ViewRoot通过addView()将View添加到根视图上,实际上是将View交给了PhoneWindow处理
  5. View的事件监听是由WindowManagerService来接受消息,并且回调Activity函数

Fragment面试题


1、Fragment为什么被称为第五大组件

Fragment比Activity更节省内存,其切换模式也更加舒适,使用频率不低于四大组件,且有自己的生命周期,而且必须依附于Activity

2、Activity创建Fragment的方式

3、FragmentPageAdapter和FragmentPageStateAdapter的区别

4、Fragment生命周期

5、Fragment的通信

6、Fragment的replace、add、remove方法

Service面试题


1、Service是什么

Service是四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件

2、Service和Thread的区别

3、Service启动方式

4、Service生命周期

  1. startService
  1. bindService

Broadcast Receiver面试题


1、Broadcast Receiver是什么

Broadcast是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们的数据

2、Broadcast Receiver的使用场景

3、Broadcast Receiver的种类

4、Broadcast Receiver的实现

5、Broadcast Receiver实现机制

6、LocalBroadcastManager特点

WebView面试题


1、WebView安全漏洞

2、WebView销毁步骤

3、WebView的jsbridge

4、WebViewClient的onPageFinished

5、WebView后台耗电

6、WebView硬件加速

Android3.0引入硬件加速,默认会开启,WebView在硬件加速的情况下滑动更加平滑,性能更加好,但是会出现白块或者页面闪烁的副作用,建议WebView暂时关闭硬件加速

7、WebView内存泄漏

由于WebView是依附于Activity的,Activity的生命周期和WebView启动的线程的生命周期是不一致的,这会导致WebView一直持有对这个Activity的引用而无法释放,解决方案如下

Binder面试题


1、Linux内核的基本知识

2、为什么使用Binder

3、Binder通信原理

  1. Service端通过Binder驱动在ServiceManager的查找表中注册Object对象的add方法
  2. Client端通过Binder驱动在ServiceManager的查找表中找到Object对象的add方法,并返回proxy对象的add方法,add方法是个空实现,proxy对象也不是真正的Object对象,是通过Binder驱动封装好的代理类的add方法
  3. 当Client端调用add方法时,Client端会调用proxy对象的add方法,通过Binder驱动去请求ServiceManager来找到Service端真正对象,然后调用Service端的add方法

4、AIDL

  1. 客户端通过aidl文件的Stub.asInterface()方法,拿到Proxy代理类
  2. 通过调用Proxy代理类的方法,将参数进行封包后,调用底层的transact()方法
  3. transact()方法会回调onTransact()方法,进行参数的解封
  4. 在onTransact()方法中调用服务端对应的方法,并将结果返回

5、BpBinder和BBinder

BpBinder(客户端)对象和BBinder(服务端)对象,它们都从IBinder类中派生而来,BpBinder(客户端)对象是BBinder(服务端)对象的代理对象,关系图如下

Handler面试题


1、Handler是什么

Handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue

2、Handler使用方法

3、Handler工作原理

4、Handler引起的内存泄漏

AsyncTask面试题


1、AsyncTask是什么

它本质上就是一个封装了线程池和Handler的异步框架

2、AsyncTask使用方法

3、AsyncTask工作原理

4、AsyncTask引起的内存泄漏

5、AsyncTask生命周期

在Activity销毁之前,取消AsyncTask的运行,以此来保证程序的稳定

6、AsyncTask结果丢失

由于屏幕旋转、Activity在内存紧张时被回收等情况下,Activity会被重新创建,此时,旧的AsyncTask持有旧的Activity引用,这个时候会导致AsyncTask的onPostExecute()对UI更新无效

7、AsyncTask并行or串行

HandlerThread面试题


1、HandlerThread产生背景

当系统有多个耗时任务需要执行时,每个任务都会开启一个新线程去执行耗时任务,这样会导致系统多次创建和销毁线程,从而影响性能。为了解决这一问题,Google提供了HandlerThread,HandlerThread是在线程中创建一个Looper循环器,让Looper轮询消息队列,当有耗时任务进入队列时,则不需要开启新线程,在原有的线程中执行耗时任务即可,否则线程阻塞

2、HanlderThread的特点、

IntentService面试题


1、IntentService是什么

IntentService是继承自Service并处理异步请求的一个类,其内部采用HandlerThread和Handler实现的,在IntentService内有一个工作线程来处理耗时操作,其优先级比普通Service高。当任务完成后,IntentService会自动停止,而不需要手动调用stopSelf()。另外,可以多次启动IntentService,每个耗时操作都会以工作队列的方式在IntentService中onHandlerIntent()回调方法中执行,并且每次只会执行一个工作线程

2、IntentService使用方法

视图工作机制面试题


事件分发机制面试题


Android项目构建面试题


1、Android构建流程

[图片上传失败…(image-ccd96b-1606878198554)]

2、jenkins持续集成构建

3、git常用命令

4、git工作流

5、proguard是什么

ProGuard工具是用于压缩、优化和混淆我们的代码,其主作用是移除或混淆代码中无用类、字段、方法和属性

6、proguard技术功能

7、proguard工作原理

将无用的字段或方法存入到EntryPoint中,将非EntryPoint的字段和方法进行替换

8、为什么要混淆

由于Java是一门跨平台的解释性语言,其源代码被编译成class字节码来适应其他平台,而class文件包含了Java源代码信息,很容易被反编译

9、annotationProcessor与compileOnly的区别

annotationProcessor与compileOnly都是只编译并不打入apk中

ANR面试题


1、什么是ANR

Application Not Responding,页面无响应的对话框

2、发生ANR的条件

应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框

3、造成ANR的主要原因

主线程被IO操作阻塞

4、如何解决ANR

OOM面试题


1、什么是OOM

OOM指Out of memory(内存溢出),当前占用内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常

2、OOM相关概念

3、解决OOM

Bitmap相关

其他相关

Bitmap面试题


1、recycle

2、LruCache原理

LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中

3、计算采样率

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;
} 

4、采样率压缩(缩略图)

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;
} 

5、质量压缩

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;
} 

6、尺寸压缩

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();
    }
}

7、保存到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);
} 

8、三级缓存

9、NDK压缩

Android进阶——图片优化之质量压缩、尺寸压缩、采样率压缩、LibJpeg压缩

10、webp压缩

Android Webp 完全解析 快来缩小apk的大小吧-鸿洋的博客

UI卡顿面试题


1、UI卡顿原理

View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象

2、UI卡顿的原因分析

3、UI卡顿的优化

内存泄漏面试题


1、Java内存泄漏引起的主要原因

长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏

2、Java内存分配策略

3、Android解决内存泄漏的例子

内存管理面试题


1、Android内存管理机制

2、内存管理机制的特点

3、内存优化方法

冷启动和热启动面试题


1、什么是冷启动和热启动

2、冷启动和热启动的区别

3、冷启动时间的计算

这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制为止

4、冷启动流程

总结:点击App->IPC->Process.start->ActivityThread->Application生命周期->Activity生命周期->ViewRootImpl测量布局绘制显示在界面上

5、冷启动优化

6、adb命令获取启动时间

adb shell am start -W packagename/MainActivity

其他优化面试题


1、Android不用静态变量存储数据

2、SharePreference安全问题

3、内存对象序列化

4、避免在UI线程中做繁重的操作

架构模式面试题


插件化面试题


1、插件化解决的问题

2、类加载器(Java中字节码添加到虚拟机中)

热更新面试题


1、热更新主要流程

2、热更新主流框架

3、热更新的原理

进程保活面试题


1、进程的优先级

2、Android进程回收策略

3、Android保活方案

Lint面试题


1、什么是Android Lint

Android Lint是一个静态代码分析工具,它能够对你的Android项目中潜在的Bug、可优化的代码、安全性、性能、可用性、可访问性、国际化等进行检查

2、Lint工作流程

[图片上传失败…(image-d5f5ab-1606878198551)]

3、配置Lint

Kotlin面试题


1、什么是Kotlin

2、Kotlin环境搭建

虚拟机面试题


1、Dalvik与JIT

Dalvik是Android虚拟机,JIT则是Dalvik采用的技术策略

在编译打包APK文件时,会经过以下流程Java->Class->Dalvik字节码(dex)->每次执行代码都要编译成机器码->交给底层处理,这样处理起来效率低下,通过引入JIT(即时编译技术),当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行即时编译,经过编译后的代码,会被优化成相当精简的原生型指令码,这样在下次执行到相同逻辑的时候,速度就会更快。但由于每次启动App都需要即时编译,导致运行时耗电量大

2、ART与AOT

ART是Android虚拟机,AOT则是ART采用的技术策略

在ART环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用,这一技术称为AOT。之后打开App的时候,不需要额外的翻译工作,直接使用本地机器码运行,因此运行速度提高。但由于会预先编译,安装时间难免会延长,而且会消耗更多的存储空间,但消耗掉空间的增幅通常不会超过应用代码包大小的20%

3、发展史

4、JVM与Dalvik不同

5、Dalvik与ART不同

注解面试题


1、什么是Annotation

Java提供的一种元程序中的元素关联任何信息和任何元数据(metadata)的途径和方法

2、什么是metadata

  1. 元数据以标签的形式存在于Java代码中
  2. 元数据描述的信息是类型安全的
  3. 元数据需要编译器之外的工具额外的处理用来生成其他的程序部件
  4. 元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部

3、注解分类

  1. 系统内置标准注解

    • @Override:表示重写
    • @Deprecated:表示已过时
    • @SuppressWarnnings:表示抑制警告
  2. 元注解

    • @Target:表示注解的修饰范围
    • @Retention:表示注解的代码生存期
    • @Documented:表示注解为程序员的API
    • @Inherited:表示注解可以继承
  3. @Target

    • ElementType.CONSTRUCTOR:构造器声明
    • ElementType.FIELD:成员变量、对象、属性(包括enum实例)
    • ElementType.LOCAL_VARIABLE:局部变量声明
    • ElementType.METHOD:方法声明
    • ElementType.PACKAGE:包声明
    • ElementType.PARAMETER:参数声明
    • ElementType.TYPE:类、接口(包括注解类型)或enum声明
  4. @Retention

    • RetentionPolicy.SOURCE:在源文件中有效,当Java文件编译成class文件的时候,注解被遗弃
    • RetentionPolicy.CLASS:在class文件中有效,当jvm加载class文件时候被遗弃
    • RetentionPolicy.RUNTIME:在运行时有效,当jvm加载class文件之后,仍然存在
  5. 生命周期

    • RUNTIME > CLASS > SOURCE
    • .java文件 --> .class文件 --> 内存中的字节码

4、注解声明

注解支持填写数组,同时支持多种范围

@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ModuleWrapper {}

5、Android Support Annotation

6、注解的用途

网络面试题

1.网页中输入url,到渲染整个界面的整个过程,以及中间用了什么协议?

1)过程分析:主要分为三步

2)其中涉及到TCP/IP协议簇,包括DNS,TCP,IP,HTTP协议等等。

2.具体介绍下TCP/IP

TCP/IP一般指的是TCP/IP协议簇,主要包括了多个不同网络间实现信息传输涉及到的各种协议
主要包括以下几层:

3.TCP的三次握手和四次挥手,为什么不是两次握手?为什么挥手多一次呢?

客户端简称A,服务器端简称B
1)TCP建立连接需要三次握手

2)TCP断开连接需要四次挥手

3)为什么挥手多一次
其实正常的断开和连接都是需要四次

但是连接中,第二步和第三步是可以合并的,因为连接之前A和B是无联系的,所以没有其他情况需要处理。而断开的话,因为之前两端是正常连接状态,所以第二步的时候不能保证B之前的消息已经发送完毕,所以不能马上告诉A要断开的消息。这就是连接为什么可以少一步的原因。

4)为什么连接需要三次,而不是两次。
正常来说,我给你发消息,你告诉我能收到,不就代表我们之前通信是正常的吗?

TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发。

TCP是怎么保证可靠传输的?

所以握手过程中,比如A发送syn信号给B,初始序列号为120,那么B收到消息,回复ack消息,序列号为120+1。同时B发送syn信号给A,初始序列号为256,如果收不到A的回复消息,就会重发,否则丢失这个序列号,就无法正常完成后面的通信了。

这就是三次握手的原因。

4.TCP和UDP的区别?

TCP提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接(三次握手),之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP 是一个简单的面向数据报的运输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达目的地。由于UDP在传输数据报前不用再客户和服务器之间建立一个连接,且没有超时重发等机制,所以传输速度很快。

所以总结下来就是:

可以看到TCP适用于稳定的应用场景,他会保证数据的正确性和顺序,所以一般的浏览网页,接口访问都使用的是TCP传输,所以才会有三次握手保证连接的稳定性。
而UDP是一种结构简单的协议,不会考虑丢包啊,建立连接等。优点在于数据传输很快,所以适用于直播,游戏等场景。

5.HTTP的几种请求方法具体介绍

常见的有四种:

6.HTTP请求和响应报文的格式,以及常用状态码

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)常用状态码

主要分为五种类型:

文档领取方式:点此快速入手通道免费获取。

上一篇下一篇

猜你喜欢

热点阅读