第一次实习Android面试前笔记整理 及 后续面经总结
1.JVM:Java虚拟机
内存区域划分:类装载器子系统、运行时数据区、执行引擎等。
类装载器子系统:加载程序中的类型(类和接口)
执行引擎:执行字节码或执行本地方法
运行时数据区:包括 方法区、堆、Java栈、PC寄存器、本地方法栈
堆:存储对象实例以及数组值
栈:虚拟机只会对Java stack执行两种操作:以帧为单位的压栈或出栈(帧代表方法)
栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
2.Java方法的两种返回方式:return和抛出异常
3.Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的算法。(基于对对象生命周期分析)
GC的基本原理:将内存中不再被使用的对象进行回收,用于回收的方法称为收集器。
1)对新生代的对象的收集称为minor GC
2)对旧生代的对象的收集称为FULL GC
3)程序主动调用System.gc()强制执行的GC称为FULL GC
不同的对象引用类型,GC会采用不同的方式进行回收
1)强引用:默认情况都是强引用(这个对象的实例没有其它对象引用,才会被GC)
2)软引用:适用于缓存场景的使用(内存不够的情况下才会被GC)
3)弱引用:GC时必然被回收
4)虚引用:只用来得知对象是否被GC
4.Activity的四种状态
-
- 在屏幕前端(堆栈栈顶),处于运行态
- 失去焦点时依然可见(新打开的activity不占用整屏,状态paused。在系统低内存时被清除)
- 被其他activity覆盖,处于stopped,仍保留数据和状态信息,对用户不可见,需要内存时被GC
- 如果处于paused或stopped状态,系统释放内存,再次需要时会重启并加载之前的状态
以上:running->paused->stopped->killed
5.Activity的可见生命周期:从onStart到onStop
6.4种状态下Activity的生命周期:
7.横竖屏切换时候 activity 的生命周期
-
- 不设置 Activity 的 android:configChanges 时 , 切屏会重新调用各个生命周期 , 切横屏时会执行一次 , 切竖屏时会执行两次
- 设置 Activity 的 android:configChanges="orientation" 时 , 切屏还是会重新调用各个生命周期 , 切横、竖屏时只会执行一次
- 设置 Activity 的 android:configChanges="orientation|keyboardHidden" 时 , 切屏不会重新调用各个生命周期 , 只会执行 onConfigurationChanged 方法
8.handler 机制的原理
andriod 提供了 Handler 和 Looper 来满足线程间的通信。 Handler 先进先出原则。 Looper 类用来管理特定线程内对象之间的消息交换 (Message Exchange) 。
-
- Looper: 一个线程可以产生一个 Looper 对象,由它来管理此线程里的 Message Queue( 消息队列 )
- Handler: 你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 Message Queue 里; 或者接收 Looper 从 Message Queue 取出 ) 所送来的消息
- Message Queue( 消息队列 ): 用来存放线程放入的消息
- 线程: UI thread 通常就是 main thread ,而 Android 启动程序时会替它建立一个 Message Queue
9.Android是基于Linux内核的,所以是软实时操作系统
10.android 中线程与线程,进程与进程之间如何通信
- 一个 Android 程序开始运行时,会单独启动一个 Process 。
默认情况下,所有这个程序中的 Activity 或者 Service 都会跑在这个 Process 。
默认情况下,一个 Android 程序也只有一个 Process ,但一个 Process 下却可以有许多Thread。
- 一个 Android 程序开始运行时,就有一个主线程 Main Thread 被创建。该线程主要负责 UI 界面的显示、更新和控件交互,所以又叫 UI Thread 。
- 一个 Android 程序创建之初,一个 Process 呈现的是单线程模型 — 即 Main Thread ,所有的任务都在一个线程中运行。所以, Main Thread 所调用的每一个函数,其耗时应该越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死 现象)。
- Android 单线程模型: Android UI 操作并不是线程安全的并且这些操作必须在 UI 线程中执行。如果在子线程中直接修改 UI ,会导致异常。
自我介绍:
面试官你好,很高兴能参加xxxx有限公司的面试,我是来自xxxx的xxx,出生于19xx年,目前大三就读于xxxx大学,计算机科学与工程学院,xxxx专业,我的求职意向是Android开发实习生。
①本人使用的语言中java、C与Android居多,由于学校项目原因前端语言例如HTML、CSS等以及脚本语言JavaScript也有所了解。在校期间做过两个项目,使用的后端语言都是java,临近期末期间策划了一个app项目,目前还处于编写阶段。
②选择安卓实习生这个岗位,首先是考虑到Android和java在我学习期间占的比例较大,并且最近的项目与之有关联,自己也对移动开发有较浓厚的兴趣。
③我认为我的沟通能力较强,并且有上进心,高三和几个热爱音乐以及后期的朋友创立了后期工作室,并且在大一上学期接到了xxxx公司,关于xxapp的后期商单,期间我全权负责与甲方进行交涉。
④在高中与大学参与学生会让我有了一定的协调与组织能力,并且通过自己的实践在公众号知乎等等平台累计了一定数量的垂直领域粉丝,这也是对我个人规划能力的一种锻炼。
⑤虽然学校的课程并没有过于深入的为我们剖析,但是经历了Android app的开发我本人也学习了解到了一些框架,并且曾经使用过Zxing框架。尽管没有实际使用但对于串口通信有一些浅层了解。
因为个人的项目终归很难接触到公司的大层面,所以希望通过实习与同事们沟通交流,对项目的开发有一个更加明确的方向,并且在其中成长。以上就是我的个人介绍,谢谢。
2020.07.28实习面经:
1.Android的4种基本组件。
2.Java的基本数据类型
3.实现图片收集功能的基本操作(基于自己规划的app)
4.实例中传入的参数类型:形参、实参
5.处于running态的activityA在打开一个activityB时,实现完全覆盖后,两者的生命周期历程。
6.用户登录时如何判断用户名是否相同。
7.串口通信的相关基本内容
8.框架调用扫码的功能介绍(ZXing)
9.本地与服务器之间的连接
总结:分两个面试官进行的面试,第一个应该是对个人的性格以及沟通能力或者过往经历有一个大致的判断。这个面试官很好,初次面试,为我的简历提供了一些建议。第二个面试官是技术面试官,提问技术问题。两个面试官都在最后提到,是否有问题需要询问他们。