2024年Android最新你不应该错过的 Android 全方位面试总结(3),oppo的面试难吗

结语

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是目录截图:

由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。

再附一部分Android架构面试视频讲解:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • delete(): 删除数据

  • query(): 查询数据

13. Android中的MVC模式。

  • Model(模型)

  • View(视图)

  • Controler(控制器)

View 传送指令到 Controller,其完成逻辑后通知 Model 改变状态,Model 将新数据更新到 View。所有通信都为单向。接受指令时,一是通过 View 接受指令并传递给 Controller;另一种是直接通过 Controller 接受指令。

14. Merge、ViewStub 的作用。

  • Merge: 减少视图层级,可以删除多余的层级,优化 UI。

  • ViewStub: 按需加载,减少内存使用量、加快渲染速度。不支持 merge 标签

15. Json有什么优劣势。

优点
  • 轻量级的数据交换格式

  • 读写更加容易

  • 易于机器的解析和生成

缺点
  • 语义性较差,不如 xml 直观

16. 动画有哪两类,各有什么特点?

  • 传统动画:帧动画和补间动画。

  • 属性动画。

区别
  • 属性动画才是真正的实现了 view 的移动,补间动画对 view 的移动更像是在不同地方绘制了一个影子,实际的对象还是处于原来的地方。

  • 当动画的 repeatCount 设置为无限循环时,如果在 Activity 退出时没有及时将动画停止,属性动画会导致 Activity 无法释放而导致内存泄漏,而补间动画却没有问题。

  • xml 文件实现的补间动画,复用率极高。在 Activity 切换,窗口弹出时等情景中有着很好的效果。

  • 使用帧动画时需要注意,不要使用过多特别大的图,容易导致内存不足。

17. Handler、Loop消息队列模型,各部分的作用。

Android消息机制包含: MessageQuene、Handler、Looper、Message.

  • Message: 需要春娣的消息,可以传递数据。

  • MessageQuene: 消息队列,通过单链表数据结构来维护消息列表,(投递和删除消息)。

  • Handler: 消息辅助类,向消息池发送各种消息事件

Handler.sendMessage 发送消息Handler.handleMessage 处理消息

  • Looper: 不断从消息队里中读取消息,按分发机制将消息分发给目标处理者。
MessageQuene、Handler 和 looper 三者之间的关系:

每个线程中只能存在一个 Looper,保存在 ThreadLocal 中。主线程(UI线程)已经创建了一个 Looper,所以在主线程中不需要再创建 Looper,其他线程中需要创建 Looper。每个线程中可以有多个 Handler,即一个 Looper 可以处理来自多个 Handler 的消息。 Looper 中维护一个 MessageQueue,来维护消息队列,消息队列中的 Message 可以来自不同的 Handler。

当调用 handler.sendMessage() 发送 message 时,实际上发送到与当前线程绑定的 MessageQuene 中,然后当前线程绑定的 Looper 不断从 MessageQueue 取出新的 Message,调用 msg.target.disspatchMessage(msg) 方法将消息分发到与 Message 绑定的 handler.handleMessage()中。

18. 怎样退出终止App。

  • 创建一个集合类对所有活动进行管理,ActivityCollector,通过 list 来管理 Activity。

  • killProcess(android.os.Process.myPid()) 杀死当前程序进程。

19. Asset目录与res目录的区别。

  • assets:不会在 R 文件中生成相应标记,存放到这里的资源在打包时会打入程序安装包中。(通过 AssetManager 类访问这些文件)

  • res:会在 R 文件中生成 id 标记,资源在打包时如果使用到则打包到安装包中,未使用到不会打入安装包中。

res/anim: 存放动画资源res/raw:和 asset 下文件一样打包时直接打入程序安装包中(会映射到 R 文件中)

Tablesassetsres/rawres/drawable
获取资源方式文件路径+文件名R.raw.xxxR.drawable.xxx
是否被压缩NONOYES(失真压缩)
能否获取子目录下的资源YESNONO

20. Android怎么加速启动Activity。

  1. onCreate() 中不执行耗时操作
  • 把页面显示的 View 细分一下,放在 AsyncTask 里逐步显示,用 Handler 更好。这样用户的看到的就是有层次有步骤的一个个的 View 的展示,不会是先看到一个黑屏,然后一下显示所有 View。

  • 最好做成动画,效果更自然。

  • 利用多线程的目的就是尽可能的减少 onCreate() 和onReume() 的时间,使得用户能尽快看到页面,操作页面。

  1. 减少主线程阻塞时间

  2. 提高 Adapter 和 AdapterView 的效率

  3. 优化布局文件

21. Android性能优化方法

  1. 布局优化:尽量减少布局文件的层级
  • 删除布局中无用的控件和层次,有选择的使用性能较低的 ViewGroup

  • 采用标签,ViewStub,布局重用可降低布局的层级(ViewStub提供了按需加载的功能,当需要时才会将 ViewStub 中布局加载到内存,提高了初始化效率)

  • 避免过度绘制

  1. 绘制优化:View 的 onDraw() 方法避免执行大量操作。
  • onDraw() 中不要创建新的布局对象。

  • onDraw() 中不做耗时任务,大量循环十分抢占 cpu 时间片,造成 View 的绘制不流畅。

  1. 内存泄漏优化
  • 避免写出内存泄漏代码

  • 通过分析工具(MAT、LeakCannary)找出潜在的内存泄漏方法,然后解决。

导致内存泄漏的原因:

  1. 集合类的泄漏

  2. 单例 / 静态变量造成内存泄漏

  3. 匿名内部类/非静态内部类造成内存泄漏

  4. 资源未关闭

  1. 响应速度的优化:避免在主线程做耗时的操作。

  2. ListView / RecyclerView优化:

  1. 使用 ViewHolder 模式来提高效率

  2. 异步加载:耗时操作放在异步线程

  3. 滑动时停止加载和分页加载

  1. 线程优化:采用线程池,避免程序中存在大量 Thread 。

  2. 其他性能优化:

  1. 不要过多的创建对象。

  2. 不要过多使用枚举类,枚举占用内存空间要比整型大。

  3. 常量使用 static final 修饰。

  4. 使用 Android 特有的数据结构。

  5. 适当采用软引用和弱引用。

  6. 采用内存缓存和磁盘缓存。

  7. 尽量采用静态内部类,可避免潜在由于内部类导致的内存泄漏。

22. Android中软引用与弱引用的应用场景。

Java 引用类型分类:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 在 Android 应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。

软/弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java 虚拟机就会把这个软引用加入到与之关联的引用队列中。利用这个队列可以得知被回收的软/弱引用的对象列表,从而为缓冲器清除已失效的软 / 弱引用。

如果只是想避免 OOM 异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。

可以根据对象是否经常使用来判断选择软引用还是弱引用。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。

23. Bitmap 压缩策略

  1. 加载 Bitmap 的方式:
  • BitmapFactory 四类方法:
  • decodeFile( 文件系统 )

  • decodeResourece( 资源 )

  • decodeStream( 输入流 )

  • decodeByteArray( 字节数 )

  1. BitmapFactory.opeions 参数
  • inSampleSize 采样率,对图片高和宽进行缩放,以最小比进行缩放(一般取值为 2 的指数)。通常是根据图片宽高实际的大小/需要的宽高大小,分别计算出宽和高的缩放比。但应该取其中最小的缩放比,避免缩放图片太小,到达指定控件中不能铺满,需要拉伸从而导致模糊。

  • inJustDecodeBounds 获取图片的宽高信息,交给  inSampleSize 参数选择缩放比。通过 inJustDecodeBounds = true,然后加载图片就可以实现只解析图片的宽高信息,并不会真正的加载图片,所以这个操作是轻量级的。当获取了宽高信息,计算出缩放比后,然后在将 inJustDecodeBounds = false,再重新加载图片,就可以加载缩放后的图片。

  1. 高效加载 Bitmap 的流程
  • 将 BitmapFactory.Options 的 inJustDecodeBounds 参数设为 true 并加载图片

  • 从 BitmapFactory.Options 中取出图片原始的宽高信息,对应于 outWidth 和 outHeight 参数

  • 根据采样率规则并结合目标 view 的大小计算出采样率 inSampleSize

  • 将 BitmapFactory.Options 的 inJustDecodeBounds 设置为 false 重新加载图片

24. 自定义View过程:onMeasure()、onLayout()、onDraw()

  • onMeasure() 方法:单一 View,一般重写此方法,针对 wrap_ content 情况,规定 View 默认的大小值,避免于 match_parent 情况一致。ViewGroup,若不重写,就会执行和单子View 中相同逻辑,不会测量子 View。一般会重写 onMeasure() 方法,循环测量子 View。

  • onLayout()方法:单一 View,不需要实现该方法。ViewGroup 必须实现,该方法是个抽象方法,实现该方法,来对子 View 进行布局。

  • onDraw() 方法:无论单一View,或者 ViewGroup 都需要实现该方法,因其是个空方法.

25. 事件分发机制

事件分发机制详解

26. Android长连接,怎么处理心跳机制。

  • 长连接:长连接是建立连接之后, 不主动断开. 双方互相发送数据, 发完了也不主动断开连接, 之后有需要发送的数据就继续通过这个连接发送.

  • 心跳包:其实主要是为了防止NAT超时,客户端隔一段时间就主动发一个数据,探测连接是否断开

  • 服务器处理心跳包:假如客户端心跳间隔是固定的, 那么服务器在连接闲置超过这个时间还没收到心跳时, 可以认为对方掉线, 关闭连接. 如果客户端心跳会动态改变,  应当设置一个最大值, 超过这个最大值才认为对方掉线. 还有一种情况就是服务器通过TCP连接主动给客户端发消息出现写超时, 可以直接认为对方掉线.

  • Android微信智能心跳方案

27. Zygote的启动过程

在 Android 系统里面,zygote 是一个进程的名字。Android 是基于 Linux System 的,当你的手机开机的时候,Linux 的内核加载完成之后就会启动一个叫 “init“ 的进程。在 Linux System 里面,所有的进程都是由 init 进程 fork 出来的,我们的zygote进程也不例外。

28. Android IPC:Binder原理。

  • IPC:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 不同进程之间彼此是不能共享的,而内核空间却是可共享的。Client 进程向 Server 进程通信,利用进程间可共享的内核内存空间来完成底层通信工作的,Client 端与 Server 端进程往往采用 ioctl 等方法跟内核空间的驱动进行交互。

  • Binder 原理:Binder 通信采用 C/S 架构,包含 Client、Server、ServiceManager 以及 binder 驱动,其中 ServiceManager 用于管理系统中的各种服务。架构图如下所示: 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Binder 四个角色:
  1. Client 进程:使用服务的进程

  2. server 进程:提供服务的进程

  3. ServiceManager 进程:将字符型是的 Binder 名字转为 Client 中对该 Binder 的引用,使得 Client 能够通过 Binder 名字获取到 Server 中 Binder 实体的引用。

  4. Binder 驱动:进程间 Binder 通信的建立,Binder 在进程间的传递,Binder 引用计数管理,数据包在进程间传递和交互等一系列底层支持。

Binder 运行机制:
  1. 注册服务:Server 在 ServiceManager 注册服务

  2. 获取服务:Client 从 ServiceManager 获取相应的 Service

  3. 使用服务:Client 根据得到的 Service 信息建立与 Service 所在的 Server 进程通信的通路可与 Server 进行交互。

29. Android 5.0,6.0,7.0 8.0新特性。

  • 5.0:
  1. Material Design

  2. 支持多种设备

  3. 全新通知中心

  4. 支持 64 位 ART 虚拟机

  5. 电池续航改进

  6. 全新“最近应用程序”

  7. 安全性改进

  8. 不同数据独立保存

  9. 改进搜索

  10. 支持蓝牙 4.1、USB Audio、多人分享等

  • 6.0:
  1. 动态权限管理

  2. 系统层支持指纹识别

最后

文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析

资料展示:

image

image

image

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

链图片转存中…(img-LFAQBQSN-1714973228639)]

[外链图片转存中…(img-mdTGN3ib-1714973228639)]

[外链图片转存中…(img-f1ghtyj2-1714973228639)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值