Android基础面试常常吊死在这几个问题上,1个、2个、3个、4个、5个、6个、7个、8个

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

面试官心里想: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的构建过程!

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

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

  1. 第一步:使用aapt(Android资产打包工具)工具编译资源文件夹(/res)。它们被编译成一个称为R.java的类文件。

  2. 第二步:通过javac将Java源代码编译为.class文件,然后通过sdk“工具”中包含的“ dx”工具将类文件转换为Dalvik字节码。输出为classes.dex。

  3. 第三步:编译,android apkbuilder,它获取所有输入并构建apk(android打包密钥)文件。

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


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

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

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

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

  1. OnCreate():这是第一次创建视图时。通常,这是我们创建视图,从包中获取数据等的地方。

  2. OnStart():在Activity对用户可见时调用。如果Activity进入前台,则紧跟着onResume();如果活动被隐藏,则紧跟着onStop()。

  3. OnResume():在Activity将开始与用户互动时调用。此时,您的Activity位于Activity堆栈的顶部,而用户输入也进入了活Activity堆栈。

  4. OnPause():当Activity进入后台但尚未被杀死时,被称为Activity生命周期的一部分。

  5. OnStop():不再对用户可见时调用。

  6. OnDestroy():Activity结束时调用!

  7. 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,您可以更新与Java Thread不同的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、面试官:Serializable和Parcelable之间有什么区别?

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

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

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

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


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值