总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-
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。
-
第三步:编译,android apkbuilder,它获取所有输入并构建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。
尾声
评论里面有些同学有疑问关于如何学习material design控件,我的建议是去GitHub搜,有很多同行给的例子,这些栗子足够入门。
有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现**NDK并不是神秘的东西,**你跟着官方的步骤走一遍就知道什么回事了,无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA->NDK->.SO->MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。
至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。
一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。
初学者,一句话,多练。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。**
初学者,一句话,多练。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!