应聘者:这个是上下文!通过它可以访问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年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
如何做好面试突击,规划学习方向?
面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。
学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。
我们搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
我们在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-TX5anZGl-1712727764174)]