时间:2017/2/17
一、笔试遇到的问题:
1、十六进制与二进制之间的转换
原理:
取四合一法 2的4次方等于16
十六进制与二进制对应关系:
理解:
将十六进制的每一位拆成四位二进制即可。
二、面试遇到的问题:
1、说说你对Activity的理解?
1)、Activity是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或者查看地图等操作。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口通常会充满屏幕,但也可能小于屏幕并浮动在其他窗口之上;
2)、一个应用通常由多个彼此松散联系的Activity组成。一般会指定应用中的某个Activity为“主Activity”,即首次启动应用时,呈现给用户的那个Activity。而且每个Activity均可启动另一个Activity,以便执行不同的操作。每次新Activity启动时,前一Activity便会停止,但系统会在堆栈(“返回栈”)中保留该Activity,当新的Activity启动时,系统会将其推送到返回栈上,并取得用户焦点。返回栈遵循基本的“后进先出”堆栈机制,因此,当用户而完成当前Activity并按“返回”按钮时,系统会从堆栈中将其弹出并销毁,然后恢复前一个Activity;
3)、当一个Activity因某个新Activity启动而停止时,系统会通过该activity的生命周期回调方法通知其这一状态变换。
补充:
任务和回退栈:
任务是指在执行特定作业时与用户交互的一系列Activity,这些Activity按照各自的打开顺序排列在堆栈(回退栈)中
2、线程与Service有什么区别?
1)线程和进程的区别:
进程是指运行中的应用程序。每一个进程都有自己独立的内存空间,一个应用程序可以同时启动多个进程;
线程是指进程中的一个执行流程,一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,他们分别执行不同的任务;
线程和进程的主要区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一个进程中的所有线程在同一块地址空间中工作,这些线程可以共享一块内存和系统资源。本质区别:进程是作为资源分配的单位,线程是调度和执行的单位
2)、线程和服务的区别(Service):
服务不是单一的进程,服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中;
服务不是线程,可以在线程中工作;
应用:
如果是长时间的在后台运行,而且不需要交互的情况下,使用服务;同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需要长时间运行的情况下使用线程;
如果人物占用CPU时间较多,资源较大的情况下,要使用线程;
Service确实是运行在主线程里的,也就是说如果你在Service里编写了非常耗时的代码,程序必定会出现ANR的。
你可能会惊呼,这不是坑爹么!?那我要Service又有何用呢?其实大家不要把后台和子线程联系在一起就行了,这是两个完全不同的概念。Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。你可能又会问,前面不是刚刚验证过Service是运行在主线程里的么?在这里一直执行着心跳连接,难道就不会阻塞主线程的运行吗?当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。
额,既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制
3、说说你对设计模式(构架)的理解?
1)、构架设计的目的:通过设计,使程序模块化,做到模块内部的高聚合和模块之间的低耦合(高内聚、低耦合),好处:提高开发效率,便于后期维护;
2)、MVC
M:Model ,模型,业务逻辑模块,如数据库、网络请求
V:View ,视图 xml文件
C:Controller 控制器,控制V层和M层通信,以达到分离视图显示层和业务逻辑层 Activity
3)、MVP 在MVC中,随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,导致其代码变得庞大臃肿,于是,演变出了MVP
Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)
View:负责绘制UI元素和与用户进行交互 Android中体现为Activity
Presenter:作为View与Model交互时的中间纽带,处理与用户交互的逻辑
View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便测试
MVC和MVP的最主要区别:
在MVP中,View与Model并不直接交互,而是通过与Presenter交互来与Model进行间接交互;而在MVC中,View可以与Model直接交互
4)、MVVM
MVVM算是MVP的升级版,VM是ViewMode的缩写
ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过DataBinding完成,而Data Binding可以实现双向的交互,这就使得视图层和控制层之间的耦合度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力
4、Activity的启动模式有哪些以及这些启动模式之间的区别?
standard:默认的,大多数Activity都是该启动模式,特点:每次激活Activity都会创建Activity实例;
singleTop:拒绝堆叠,即如果栈顶正好存在该Activity实例,则重用,否则即使在该栈中已经存在该Activity,只要不是在栈顶,都会创建新的实例。应用场景:新闻类或者阅读类App的内容页面;
singleTask:栈中只能存在一个该Activity实例,即如果该栈中已经有该Activity实例,则重用该实例,并且重用时,会让该实例回到栈顶,因此,其上的Activity实例将会被移出栈,不存在则创建。应用场景:浏览器的主界面,无论多少个应用启动浏览器,只会启动主界面一次,其余情况会走onNewIntent(),并且会清空主界面上面的其他页面;
singleInstance:在一个新栈中创建Activity实例,并且让多个应用共享该栈中的该Activity实例。效果相当于多个应用共享一个应用,不管谁激活Activity,都会进入同一个应用中。使用场景:闹铃提醒,将闹铃提醒与闹铃设置分离。
5、写一个二分查找的代码?
注意:
遇到写代码的题目,应该先分析该题目的原理,弄清楚后,再写代码,切不可一听题目,立即背代码,切记
完整过程
1)、分析
函数===》参数和返回值;
参数:查找什么?从什么中查找?===》key(查找需要查找的值),int[] arr(从数组中查找该key值)
返回值:查找之后怎么办?===》返回对应位置的下标==》返回值为int类型
2)、代码:
//arr:int型的一维数组,查找的范围 key:查找的关键字
public int binarySearch(int []arr,int key){
int low=0;
int high=arrr.length-1;
int mid=0;
while(low<=high){
mid=(low+high)/2;
if(key>arr[mid]){
low=mid+1;
}else if(key<arr[mid]){
high=mid-1;
}else{
return mid;
}
}
return -1;
}
三、”你还有什么想要问我的吗?“之提问
回答的关键:和工作切身相关
1、我很想争取进入贵公司,所以想了解公司对这份工作的期待与目标;
2、从事Android开发是我一直以来的梦想,在您看来,成为一名合格的Android开发者,我还需要具备哪些条件?
3、贵公司对新员工有没有什么培训项目?怎样可以参加?
4、我在贵公司的发展前景是什么样的?
四、总结
1、由于种种原因,第一次参加面试,于是带着试一试的态度,心态倒是挺好的,只是一个年过了,大概有一个多月没有看笔记了,连一个二分查找都可以写错,确实是有些过分;
2、无论是笔试还是面试,真的都很基础,或者说是我没想到吧:也在网上看了一些面试题,当时的想法是,怎么可能面试问的都一样呢?于是看得很漫不经心,结果,当面试官真的问的和哪些面试题基本一致的时候,自己真的傻眼了。看来,还是要多面试几次呀,否则,光看笔记和面试题,真的好难有感觉呀。
3、面试官最后问我有什么要问他的没有,我只想到了微信上好多有关此类的题目,而自己只是收藏了,偶尔看了,并没有用心记,于是想了好久便把面试官刚才问我的我不知道的问题又向他请教了,他估计是没有想到我会这么不按规矩出牌吧,愣了一瞬间,便大概给我说了一下,”网上这个挺多的,你回去查查吧“。
4、面试结束时,遇到了一个同样来面试Android开发的同学,便聊了起来,果然,还是同行说起话来不费劲呀。他说他听说过一个问题”如果你在一个公司里工作,你掌握了一门新的技术,你会教给其他同事吗?“,我当时的回答是”肯定会呀“,他说”一旦你告诉了其他人,他们学会了,假设有一天公司需要裁员,你也有可能会被裁掉,可是如果你不说,整个公司就只有你一个人会,肯定不会裁你的“,”那是公司没有眼光“,我有些无语。他说”我感觉这个问题就是一个坑呀,貌似怎么回答都有可能会错“,”是啊!关键还得看面试官怎么想,还有就是这个公司的规模和理念“我也附和着。此刻在想想这个问题,又不知道怎么回答了。