Android面试笔记(2)

225 阅读7分钟

比较SparseArray和HashMap的特性

  1. SparseArray 基于数组和二分查找,只支持整数键,对于稀疏数据,内存效率较高,在整数键且数据量较小时性能较好
  2. HashMap 基于哈希表,支持各种类型的键,相对较高,但不如 SparseArray 对于稀疏数据高效,性能较为稳定,适用于各种数据量

为什么推荐用SparseArray代替HashMap?

  1. SparseArray,翻译过来称为“稀疏数组”,所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。
  2. SparseArray 比 HashMap 更省内存,在某些条件下性能更好,主要是因为它避免了对 key 的自动装箱(int 转为 Integer 类型)。
  3. 它内部则是通过两个数组来进行数据存储的,一个存储 key,另外一个存储 value。
  4. 为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间。

这里有个误区,应该说数据量不大且key的类型是int类型的情况下才推荐用SparseArray代替HashMap。

请说明内存泄漏的原因及诊断和解决的方法

  1. 内存泄漏的原因:
  • 未正确释放对象:对象引用未及时置空或资源未及时关闭。
  • 静态变量持有对象:静态变量长期持有对象引用,导致对象无法被回收。
  • 资源未关闭:如文件、网络连接、数据库连接等未及时关闭。
  1. 诊断方法:
  • 使用内存分析工具:如 Android Profiler 等,分析内存使用情况。
  • 观察应用行为:是否出现卡顿、闪退等异常现象。
  1. 解决方法:
  • 及时释放资源:确保在不再使用对象或资源时,及时释放。
  • 避免静态引用:尽量减少静态变量对对象的长期引用。
  • 优化代码逻辑:检查并优化可能导致内存泄漏的代码部分。

如何计算一张图片在内存中的大小

  1. 获取图片的像素尺寸,即长和宽。
  2. 根据图片的格式(如 JPEG、PNG 等)确定每个像素占用的字节数。
  3. 将像素尺寸相乘,得到总像素数。
  4. 将总像素数乘以每个像素占用的字节数,即可得到图片在内存中的大致大小。

如何检测应用卡顿的原因?

  1. 使用性能分析工具:如 Android Studio 中的 Profiler 工具,它可以实时监测 CPU、内存等使用情况,帮助定位问题。
  2. 查看日志:分析应用的日志信息,可能会发现一些异常或耗时操作的线索。
  3. 分析代码执行时间:通过在关键代码处添加时间统计,来确定是否存在执行时间过长的部分。
  4. 检查线程状态:查看是否有线程阻塞或等待时间过长的情况。
  5. 监测界面渲染:检查界面是否存在频繁刷新或渲染不流畅的问题

请介绍下Android中常用的布局方式及优缺点

  1. LinearLayout(线性布局):
  • 优点:简单易用,能够明确地控制子元素的排列方向。
  • 缺点:灵活性相对较差,当布局较为复杂时可能会导致嵌套过多。
  1. RelativeLayout(相对布局):
  • 优点:可以灵活地指定子元素之间的相对位置,实现较为复杂的布局。
  • 缺点:在复杂布局中可能会导致性能问题。
  1. FrameLayout(帧布局):
  • 优点:简单直观,常用于覆盖或层叠子元素。 -缺点:布局的灵活性有限。
  1. GridLayout(网格布局):
  • 优点:方便实现网格状的布局。
  • 缺点:在低版本系统中的兼容性可能存在问题
  1. ConstraintLayout(约束布局)。
  • 优点:高效灵活:能减少布局嵌套,提高性能。强大的约束能力:可以精确地控制子元素的位置和尺寸。
  • 缺点:学习成本较高:需要一定时间来理解和掌握其约束机制。

请介绍下Anndroid的数据存储方式

  1. SharedPreferences:用于存储简单的键值对数据,以 XML 文件形式存储,适合存储少量配置信息。
  2. SQLite 数据库:可以创建和管理数据库,用于存储结构化的数据。
  3. 文件存储:直接将数据写入文件中,适用于存储较大的数据文件。
  4. Datastore

Android中的动画有哪几类,他们的特点和区别是什么?

  1. 补间动画(Tween Animation):
  • 特点:通过对视图的属性(如位置、大小、透明度等)在一定时间内进行线性变化来实现动画效果。
  • 区别:只能对已有视图进行动画操作,不能创建新的视图,动画效果相对比较简单。
  1. 属性动画(Property Animation):
  • 特点:可以对任意对象的属性进行动画操作,包括自定义属性,支持更复杂的动画效果。
  • 区别:功能更强大,灵活性更高,但相对较复杂一些,需要更多的代码编写。
  1. 补间动画通常适用于以下场景:
  • 简单的视图变换:如位置移动、缩放、旋转等基本动画效果。
  • 对已有视图的快速动画处理:不需要深入自定义或与复杂对象交互的情况。
  1. 属性动画则更适合以下场景:
  • 复杂的动画需求:需要对非视图对象或自定义属性进行动画操作。
  • 与数据驱动的动画相关:根据数据变化实时调整动画效果。
  • 与交互操作结合:如响应触摸事件等产生动画效果。

Activity的生命周期?Fragment的生命周期?

  1. Activity 的生命周期:
  • onCreate():初始化 Activity 时调用。
  • onStart():Activity 变为可见时调用。
  • onResume():Activity 获得用户焦点时调用。
  • onPause():Activity 暂停时调用。
  • onRestart():当 Activity 从停止状态重新启动时调用
  • onStop():Activity 不可见时调用。
  • onDestroy():Activity 销毁时调用。
  1. Fragment 的生命周期:
  • onAttach():Fragment 与 Activity 关联时调用。
  • onCreate():创建 Fragment 时调用。
  • onCreateView():创建 Fragment 的视图时调用。
  • onViewCreated():Fragment 的视图创建完成时调用。
  • onActivityCreated():Activity 的 onCreate 方法执行完后调用。
  • onStart():Fragment 可见时调用。
  • onResume():Fragment 获得用户焦点时调用。
  • onPause():Fragment 暂停时调用。
  • onStop():Fragment 不可见时调用。
  • onDestroyView():Fragment 的视图销毁时调用。
  • onDestroy():Fragment 销毁时调用。
  • onDetach():Fragment 与 Activity 分离时调用。

ACtivity的四种启动模式

Android 中有四种启动模式:standard(默认模式)、singleTop、singleTask 和 singleInstance 。

  1. standard 模式:每次启动都会创建新的实例,这可能会导致同一个 Activity 存在多个实例。

    • 注意事项:如果频繁创建新实例可能消耗较多资源,要注意控制 Activity 的创建频率。
  2. singleTop 模式:如果 Activity 已经在栈顶,就不会创建新的实例,而是调用其 onNewIntent 方法。如果不在栈顶,还是会创建新的实例。

    • 注意事项:在处理 onNewIntent 时,要正确更新界面数据。
  3. singleTask 模式:在一个任务栈中只会存在一个实例。如果要启动的 Activity 已经存在于栈中,会将其上面的 Activity 出栈,使其位于栈顶。

    • 注意事项:可能会影响到栈中 Activity 的生命周期,需要处理好 Activity 之间的交互和数据传递。
  4. singleInstance 模式:单独存在于一个任务栈中,并且整个系统中只有一个实例。

    • 注意事项:与其他 Activity 交互时需要特别处理,因为它们处于不同的任务栈。