前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >已中招!Android 基础面试常常吊死在这几个问题上……

已中招!Android 基础面试常常吊死在这几个问题上……

原创
作者头像
Android技术干货分享
修改2020-08-14 17:55:08
2K0
修改2020-08-14 17:55:08
举报
文章被收录于专栏:Android技术分享Android技术分享

Android面试常常吊死的问题

1、面试官:Context它是什么,有什么用? 2、面试官:什么是Armv7? 3、面试官:为什么字节码不能在Android中运行? 4、面试官:Gradle中的BuildType是什么?你一般用它来干什么? 5、面试官:简述一下Android的构建过程! 6、面试官:说一下Activity的生命周期! 7、面试官:既然提到了Activity生命周期,说一下 OnCreate() 和 OnStart() 的区别! 8、面试官:为什么要在Activity类的onCreate() 中执行setContentView()? 9、面试官:说一下Android的几种启动模式吧!他们分别是干什么的? 10、面试官:当旋转屏幕时,Activity如何响应? 11、面试官:你是如何做到旋转屏幕时防止数据重新加载和重置的? 12、面试官:说一下AsyncTasks和线程他们的区别! 13、面试官:AsyncTask和Activity的生命周期两者有什么关系?这会导致什么问题?如何避免这些问题? 14、面试官:Serializable和Parcelable之间有什么区别? 15、面试官:什么是(ANR)错误,如何防止它在应用程序中发生? 16、面试官:SharedPreferences中的commit() 和apply() 有什么区别? 17、面试官:RecyclerView它是怎么工作的? 18、面试官:再说一下RecyclerView与ListView有何不同? 19、面试官:MVC,MVP和MVVM有何区别?都有哪些优缺点?

第一波

1、面试官:Context 它是什么,有什么用?

应聘者:这个是上下文!通过它可以访问application的资源和相关的类!

面试官:什么是 Activity Context 呢?为什么要用?

应聘者:此上下文在 Activity 中可用。该上下文与 Activity 的生命周期相关。在 Activity 范围内传递上下文或需要其生命周期附加到当前上下文的上下文时,应使用 Activity 上下文。

面试官:那 Application Context 是什么呢?有什么用?

应聘者:我......

面试官:先回去等通知吧!

Application Context 它与应用程序的生命周期相关。当您需要一个生命周期与当前上下文分开的上下文时,或者在传递超出活动范围的上下文时,可以使用 Application Context 。

2、面试官:什么是 Armv7 ?

应聘者:我怎么知道?

面试官:我也不知道!我想让你给我---------“讲讲”!

面试官心里想:Android 中有7种 CPU 架构。ARMv7 是最常见的,因为它针对电池消耗进行了优化。ARM64 是该版本的改进过的,支持64位处理以实现更强大的计算。ARMx86 在这三者中使用最少,因为它对电池不友好。它比其它两个功能强大。

备注:在Android 系统中,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64!

3、面试官:为什么字节码不能在Android中运行?

应聘者:Android 使用的是 DVM ( Dalvik 虚拟机)而不是 JVM ( Java 虚拟机)。

面试官:不错,答上来了!

4、面试官:Gradle 中的 BuildType 是什么?你一般用它来干什么?

应聘者:不知道呀!能给我讲一下吗?

面试官:我讲完你就回去等通知吧!

BuildType 定义了 Gradle 在构建和打包 Android 应用时使用的属性。一般这样可以用到,1、 BuildType 定义了如何构建模块,例如是否运行 ProGuard ;2、构建中包含哪些资源可以用到 BuildType ;3、 Gradle 为项目的产品风格和构建类型的每个可能组合创建一个构建变体。

应聘者:好的我知道了,我先回去等通知了!

5、面试官:简述一下 Android 的构建过程!

应聘者:就是先编译,然后进行打包这样的过程!

面试官:确实够简单的!人才!我给你说下吧!

第一步:使用 aapt ( Android 资产打包工具)工具编译资源文件夹(/res)。它们被编译成一个称为 R.java 的类文件。 第二步:通过javac将Java源代码编译为 .class 文件,然后通过 sdk “工具”中包含的“ dx” 工具将类文件转换为 Dalvik 字节码。输出为 classes.dex 。 第三步:编译, androidapkbuilder ,它获取所有输入并构建 apk(android打包密钥)文件。

应聘者:学到了,学到了!(可能在想,比我说的复杂,这不是简述)

第二波

6、面试官:说一下Activity的生命周期!

应聘者:这个我知道,OnCreate(),OnStart(),OnResume(),OnPause(),OnStop(),OnDestroy(),OnRestart() 共7个!

面试官:这就完了?背下来这个有啥用?

面试官:我给你讲讲吧,你去别的公司面试你,你可以这样回答:

  • OnCreate():这是第一次创建视图时。通常,这是我们创建视图,从包中获取数据等的地方。
  • OnStart():在Activity对用户可见时调用。如果Activity进入前台,则紧跟着onResume();如果活动被隐藏,则紧跟着onStop()。
  • OnResume():在Activity将开始与用户互动时调用。此时,您的Activity位于Activity堆栈的顶部,而用户输入也进入了活Activity堆栈。
  • OnPause():当Activity进入后台但尚未被杀死时,被称为Activity生命周期的一部分。
  • OnStop():不再对用户可见时调用。
  • OnDestroy():Activity结束时调用!
  • OnRestart():在Activity停止之后,再次开始之前调用!

应聘者:…(当时应聘者的心理是这样的,不知道怎么说话)

7、面试官:既然提到了 Activity 生命周期,说一下 OnCreate() 和 OnStart() 的区别!

应聘者:emmmmmm!区别不大!

面试官:不大?在 Activity 生命周期中,无论是在应用程序启动时,还是在Activity 被销毁然后重新创建(例如在配置更改期间)时,都会调用一次 onCreate() 方法。只要 Activity 对用户可见(通常在 onCreate() 或 onRestart() 之后),就会调用 onStart() 方法。

8、面试官:为什么要在 Activity 类的onCreate() 中执行setContentView() ?

应聘者:打开 AndroidStudio 就是生成在这里,具体为什么要在这里,我也不知道!

面试官:回答的真漂亮!由于 Activity 的 onCreate() 仅被调用一次,因此大多数初始化都应该在此进行。由于 setContentView() 是一项繁重的操作,因此无法在 onResume() 或onStart() (多次调用)中设置内容是无效的。

9、面试官:说一下Android的几种启动模式吧!他们分别是干什么的?

应聘者:一共有四种启动模式 Standard、SingleTop、SingleTask、SingleInstance。Standard 是默认的,就是在不指定启动模式的时候用到的是这个!其他的在指定的时候使用!

面试官:你糊弄我呐?

  • Standard:它在启动 Activity 的任务中创建 Activity 的新实例。可以创建 Activity 的多个实例,并且可以将多个实例添加到相同或不同的任务。

例如:假设有一个 Activity 堆栈A->B->C。

现在,如果我们以启动模式为 “Standard” 再次启动B ,则新堆栈将为A->B-> C->B;

  • SingleTop:与标准 Standard ,除了堆栈顶部存在 Activity 的先前实例之外,它不会创建新实例,而是将意图发送给 Activity 的现有实例。

例如:假设有一个活动堆栈A->B。

现在,如果我们以启动模式为“ singleTop”启动C ,则新堆栈通常将是A-> B->C。

再举一个例子,如果有一个活动堆栈A-> B->C。如果我们以启动模式为“ singleTop”再次启动C ,则新堆栈仍为A-> B->C。

  • SingleTask:始终将创建一个新任务,并将新实例作为根实例推送到该任务。因此,如果 Activity 已经在任务中,则该意图将被重定向到onNewIntent( ) ,否则将创建一个新实例。一次只有一个Activity实例存在。

例如:假设有一个活动堆栈A->B-> C->D。

现在,如果我们以启动模式为 “ singleTask” 启动D ,新堆栈将为A-> B-> C-> D !

如果有一个活动堆栈A->B-> C->D。

如果我们以启动模式为 “singleTask” 再次启动活动B ,则新的活动堆栈将为A->B。活动C和D将被摧毁。

  • SingleInstance:与单个任务相同,但是系统不会在与此 Activity 相同的任务中启动任何 Activity 。如果启动了新 Activity ,则它们是在单独的任务中完成的。

例如:假设有一个Activity堆栈A->B-> C->D。

如果我们以启动模式为 “ singleInstance” 再次启动 ActivityB ,则新的活动堆栈将为:

任务1 :A->B-> C

任务2 :D

10、面试官:当旋转屏幕时,Activity如何响应?

应聘者:旋转屏幕时,当前的 Activity 实例将被破坏,并以新的方向创建Activity的新实例。旋转屏幕时,由于屏幕旋转时会重新创建布局,将首先调用onCreate() 方法。接下来照常按顺序执行!

第三波

11、面试官:你是如何做到旋转屏幕时防止数据重新加载和重置的?

应聘者:使用 ViewModels 和的组合 onSaveInstanceState() , ViewModel 具有 LifeCycle-Aware 的功能。换句话说,如果 ViewModel 的所有者因配置更改(例如,旋转)而被销毁,则不会销毁它。所有者的新实例将重新连接到现有的 ViewModel 。因此,如果您将一个 Activity 旋转3次,则您刚刚创建了三个不同的 Activity 实例,但是只有一个 ViewModel 。通常的做法是将数据存储在 ViewModel 类中(因为它在配置更改期间保留数据),并使用 OnSaveInstanceState 存储少量UI数据。

面试官:回答得不错!

12、面试官:说一下 AsyncTasks 和线程他们的区别!

应聘者:应使用线程将长时间运行的操作与主线程分开,以提高性能。但是它不能被优雅地取消,并且不能处理 Android 的配置更改。无法从 Thread 更新 UI 。

AsyncTask 可用于处理持续时间少于5毫秒的任务。使用 AsyncTask ,您可以更新与JavaThread不同的UI。但是,很多长时间运行的任务会降低性能。

13、面试官:AsyncTask 和 Activity 的生命周期两者有什么关系?这会导致什么问题?如何避免这些问题?

应聘者:我没有遇到过问题!

面试官:回答得漂亮!我给你说下吧!

  • AsyncTask与包含它的Activity的生命周期无关。因此,例如,如果在Activity中启动AsyncTask且用户旋转设备,则该Activity将被销毁(并创建一个新的Activity实例),但AsyncTask不会死亡,而是继续生存直到完成;
  • 当AsyncTask确实完成而不是更新新Activity的UI时,它更新了Activity的前一个实例(即创建它的实例,但不再显示!)。这可能导致异常(类型为java.lang.IllegalArgumentException:如果使用例如findViewById在Activity中检索视图,则视图未附加到Window manager);
  • 由于AsyncTask对Activity的引用,因此也有可能导致内存泄漏;
  • 由于这些原因,将AsyncTasks用于长时间运行的后台任务通常不是一个很好的行为。而是,对于长时间运行的后台任务,应采用其他机制(例如服务);

备注:默认情况下,AsyncTasks 使用串行执行程序在单个线程上运行,这意味着它只有一个线程,每个任务一个接一个地运行。

14、面试官:erializable 和 Parcelable 之间有什么区别?

应聘者:我没有太深入了解…

面试官:序列化是将对象转换为字节流以便将对象存储到内存中的过程,以便可以在以后的时间重新创建它,同时仍保留对象的原始状态和数据。

可以将变量声明为 transient 来禁止序列化。

可序列化是标准的 Java 接口。Parcelable 是 Android 专用的界面,可以在其中自行实现序列化。它的创建要比 Serializable 的效率要高得多(此方法的问题是使用了反射,这是一个缓慢的过程。此机制还倾向于创建许多临时对象,并导致相当多的垃圾回收。)

15、面试官:什么是(ANR)错误,如何防止它在应用程序中发生?

应聘者:当 UI 停止响应超过5秒以上时,通常会因为已阻塞主线程而出现 ANR 对话框。为避免遇到ANR错误,应将尽可能多的任务移出主线程。

例如,当需要加载手机中很多图片并要求拿到各种信息时,如照片的尺寸等,或读取非常大的 Json 文件时候,应该放到子线程中操作,当处理完毕后,通知主线程继续执行任务!

第四波

16、面试官:SharedPreferences 中的 commit() 和 apply() 有什么区别?

应聘者:都是数据写入,一个是同步,一个是异步!

面试官:是的!

  • commit() 同步写入数据,并根据结果立即返回成功或失败的boolean类型值。
  • apply()是异步的,不会返回任何布尔响应。同样,如果有一个apply() 未完成,将执行另一个commit() 。commit() 将被阻止,直到apply() 未完成。
17、面试官:RecyclerView 它是怎么工作的?

应聘者:它是一个列表,有自己的适配器,在 onBindViewHolder 方法中进行数据的绑定的!

面试官:我给你补充一下!

RecyclerView 在显示较长的项目列表。假设我们要显示100行项目。一种简单的方法是只创建100个视图,每行一个视图,然后将它们全部布局。但这是浪费的,因为在任何时间点上,只有10个左右的项目可以放在屏幕上,而其余项目则不在屏幕上。因此, RecyclerView 只创建屏幕上的10个左右的视图。这样,速度和内存使用率将提高10倍。但是,当开始滚动并需要开始显示下一个视图时会发生什么?同样,一种简单的方法是为需要显示的每个新行创建一个新视图。但是通过这种方式,当您到达列表的末尾时,将创建100个视图,并且的内存使用情况将与第一种方法相同。创建视图需要花费时间,因此您的滚动很可能不会很流畅。这就是为什么 RecyclerView 会利用以下事实:滚动时,新行出现在屏幕上,而旧行消失在屏幕上。代替为每个新行创建新视图,而是通过将新数据绑定到旧视图来对其进行回收和重用!

应聘者:我学到了!

18、面试官:再说一下RecyclerView与ListView有何不同?

应聘者:RecyclerView 是 ListView 的大哥, ListView 的升级版!

面试官:你这个回答我是第一次见!

  • ViewHolder模式:Recyclerview实现了ViewHolders模式,但在ListView 中不是必需的。RecyclerView 在滚动时回收并重用单元格。
  • LayoutManager:在 ListView 中,唯一可用的视图类型是垂直ListView。RecyclerView 将列表与其容器分离,因此可以通过设置LayoutManager在运行时轻松地将列表项放在不同的容器(linearLayout,gridLayout)中。
  • Recyclerview有着更多的动画效果支持!
  • ViewHolder的模式:ViewHolder 对象将每个组件视图存储在 Layout 的 tag 字段内,因此可以立即访问它们而无需重复查找它们。在 ListView 中, findViewById() 在滚动 ListView 期间,代码可能会频繁调用,这可能会降低性能。即使适配器返回膨胀视图以进行回收,仍然需要查找元素并进行更新。重复使用的一种方法 findViewById() 是使用 “ViewHolder” 设计模式。
19、面试官:MVC,MVP 和 MVVM 有何区别?都有哪些优缺点? 应聘者:这个我知道!
  • MVC 是 Model-View-Controller 体系结构,其中模型是指数据模型类。该视图引用xml文件,并且控制器处理业务逻辑。这种体系结构的问题是单元测试。该模型不受任何约束,因此可以轻松测试。控制器与 Android api紧密耦合,因此很难进行单元测试。由于视图和控制器紧密耦合,因此模块化和灵活性是一个问题。如果我们更改视图,则控制器逻辑也应更改。维护也是一个问题。
  • MVP是Model-View-Presenter体系结构,该视图包括xml和Activity/Fragment 类。因此,该活动理想情况下将实现一个视图界面,从而使单元测试更加容易(因为这将在没有视图的情况下起作用)
  • MVVM 是 Model-View-ViewModel 体系结构。它本质上就是 MVC 的改进版。MVVM 就是将其中的 View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。

面试官:这是你回答过的最漂亮的一个了。

最后

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2020BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

需要的朋友可以关注【我的简介】~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Android面试常常吊死的问题
  • 第一波
  • 第二波
  • 第三波
  • 第四波
  • 最后
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档