Android面试总结(不定时更新版)

时间:2022-09-08 17:48:34

前言

因为个人原因想换个公司,所以最近一直忙着交接工作和准备面试,可能准备得比较充分面了几家都过了,然后进了第一家,一直想写个文章记录下面试的事情,所以每次面试完我就在笔记本上记录了面试的问题,然后断断续续写了这篇文章,文章存了很久一直没发表,一个是前面刚入职看”前任”的代码没时间,另一个觉得内容不够丰满所以一直没发表,文章的问题是我个人的面试经历,问题的答案有些并不是当时面试的回答,是我参考了相关资料重新组织语言来说明的,希望找工作的筒子能从中得到帮助,PS:因为可能涉及公司隐私所以我把公司名字给忽略了。


广西XXX网络科技有限公司

一些废话:笔试大概二十来分钟,面试大概一个半小时,一面是另一个项目组的Android技术大牛来面的,全程我感觉他都对我不露任何表情(可能大神的高傲..),但是入职以后发现这大牛其实人还不错的,二面是所在项目组的组长,好像是产品出身,所以二面没聊技术,就聊些有的没得,把该跟HR聊得在这面里聊了,入职以后发现其实公司氛围很好,上班不用打卡,免费零食水果(就是这么容易被满足..),五险一金按全额工资比例买,而且最主要的是人事妹子很漂亮有没有!!别的项目组的测试妹子很漂亮有没有!!我上个部门驻点开发,整个部门23个人,全他么是男的有没有!!那种感觉很影响工作心情有没有!!咳咳,好了回归主题..

笔试(摘选)

其实我对这些笔试是很鄙夷的,网上找些笔试题然后让我们做,但是我还是偷偷拍下了笔试题,毕竟没准下一家公司跟这家找的是同一套题呢(坏笑脸)..
Q、下列代码的执行结果是什么

System.out.print(100 % 3);
System.out.print(",");
System.out.println(100 % 3.0);

A::1,1.0,这送分题,java自动类型转换,不会的查资料去…

Q、在继承中,关于构造方法的说明,下列说法错误的是
A、子类无条件的继承父类的无参构造方法,
B、子类可以引用父类中的有参构造方法,使用super关键字,
C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法,
D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。
A:这题选D,错得很明显

Q、下列代码的执行结果是什么

int x=3;  
int y=1;
if(x==y)
System.out.println("Not equal");
else
System.out.println("Equal");

A:输出为:Equal,吐槽:想出这道题的人我也是服了..

Q、下列代码的执行结果是什么

public class MyClass{
static int i;
public static void main(String argv[]){
System.out.println(i);
}
}
A) Error Variable i may not have been initialized
B) null
C) 0
D) 1

A: C整型全局变量初始化值为0

Q、常用的设计模式
A: 单例 工厂 建造 代理 观察者 适配器模式等等..

Q、android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库进行管理的方法可以是?

  • getWriteableDatabase()
  • getReadableDatabase()
  • getDatabase()
  • getAbleDatabase()

A: getReadableDatabase()和 getWriteableDatabase()都可以得到一个可既可以读又可以写的数据库对象,不同的是,当磁盘空间满了之后, getReadableDatabase()得到的是一个只读的对象,而 getWriteableDatabase()则会抛出异常。

Q、 Intent传递数据时,下列的数据类型哪些可以被传递
A、Serializable B、charsequence C、Parcelable D、Bundle
A: ABCD

Q、 android 中下列属于Intent的作用的是
A、实现应用程序间的数据共享
B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
D、处理一个应用程序整体性的工作
A: A

我本来想一道道写出来,但是发现好多都是很基础的,一个个列出来好费时间…所以我就列出来问题大概意思好了,不知道的自己去查资料..android五大布局、四大组件、activity四种启动模式、service的启动方法、android数据存储方式、性能优化、开发技巧、代码优化,数组排序,连续有序的数组有且只有两个数相同,写方法找出来,还有些智力题就不列出来了..以上就是整个笔试题了,笔试时间要求四十分钟内,其实我做下去也就二十来分钟就做完了..

面试(摘选)

自我介绍: 这个环节基本都是每个面试的开场白,回答的时候应该有下面几个重点

  1. 个人基本信息(姓名、年龄、老家、居住地等);
  2. 来自哪里(工作地点),是干什么的(Android开发工程师),担任过什么职务、做过什么样的项目;
  3. 自己为何来公司面试;
  4. 最后祝愿(希望能得到贵公司的认可等等)。

PS:真诚自然,不能给人套路的感觉(微笑脸)。

Q、上家公司的情况
这个问题就如实说就好了,比如我当时说的是我上家公司是XXX公司,在XXX,是做XXX的,主要的项目是XXX之类的,其实问这种问题最好回答了,在这种问题上尽量扯久点,这样问别的技术问题的时间可能就少了,成功的概率就又大了点(~ _~)

Q、项目经验
这个就说自己做过的项目,要点也就这几个,这个项目是什么类型的,自己负责的模块,如果可以,把项目用到的技术跟项目碰到的问题和解决方案都说出来,注意一点,千万不要把作为一颗螺丝钉的功能放大到主结构的功能,当然要是在这个项目上真的是自己独立设计框架之类的这些就没什么了。

Q、用SQL语句获取当前时间
mysql 、 access: select now();
sqlserver : select getdate();
oracle : select to_char(sysdate(‘yyyy-mm-dd hh24:mi:ss));
讲真关于数据库这块我是弱项,我真的怕他接着问数据库的优化或者再往下深入的问,然后我当时说完就扯别的了,扯到别的什么地方我也不记得了..
Q、Activity的生命周期跟四种启动模式
这个问题我以前在博客中分析过,其实就是回答生命周期,然后在什么场景会触发这些生命周期方法,如果想加分的话可以再说下异常情景下怎么保存数据,然后四种启动模式要说明应用场景(PS:最后附上一句,启动模式的设置要符合应用场景,不能为了设置启动模式而设置启动模式,多说了这句话逼格会高很多- -!),另外附上链接:
Activity生命周期
Activity四种启动模式

Q、在Java中对象的引用有几个级别
在Java中对象的引用有四个级别,强引用 、软引用、弱引用、虚引用。

强引用:最普遍的引用,不申明对象引用时默认就是这个引用。在Java中即使内存不足,垃圾回收器(GC)也只是抛出OutOfMemoryError异常而不会回收使用这个引用的对象。

软引用(SoftReference):只要内存足够,垃圾回收器(GC)就不会回收这个对象,如果内存不足,垃圾回收器(GC)就会回收使用了这个引用对象的内存,
使用方法:

  Object obj = new Object();
SoftReference softReference =new SoftReference(obj);

这样obj这个对象的引用就是软引用了。

弱引用(WeakReference):跟软引用类似,但是不同点在于只要垃圾回收器(GC)扫描了这个引用所在区域的内存时,无论内存足够与否都会去回收这个对象的内存。使用方法:

 Object obj = new Object();
WeakReference weakReference =new WeakReference(obj);

虚引用(PhantomReference):
这个引用随时都会被垃圾回收器(GC)回收使用方法同上,就是换个类。
其实说到上面那样的层面已经差不多了,想活学活用可以说在ListView优化的时候使用弱引用(WeakRefrence)引用ImageView对象,但是说这个的前提是你得熟悉ListView优化,不然有些老程序员可能会接着这个点问下去的。既然说道ListView优化这里多提一下ListView优化,可以由以下几种方式优化
①. 复用ConvertView
②. 自定义静态类ViewHolder
③. 使用分页加载
④.使用弱引用(WeakRefrence)引用ImageView对象
然后一个个把上面的点进行分析。

Q、startService和bindService的区别
这两种方式最主要的区别是startService是当调用者一旦启动Service这时调用者跟Service没什么关联,这种方式一般通过Context.stopService来停止服务,而bindService可以绑定(调用)Service的方法或数据,unBindService可以解绑服务。

Q、看简历你写平常会写写博客,你一般写些什么
我写博客的目的是为了记录Android开发的,所以博客写的都是Android开发的知识点,遗憾的是浏览量很少,主要是以后忘了的时候翻一番自己写的东西,写了博客以后才发现写一篇博客要查很多的资料,同时也能掌握一些平常没注意的知识点,等等杂七杂八的..

Q、那你有没有在github上开源过什么项目吗
没有,我希望以后有机会参与…

Q、Android进行跨进程的几种方式
这个问题我以前也分析过..就把几种跨进程的含义介绍一遍然后把方式、使用方法跟应用场景一个个进行分析,然后总结下他们的优缺点..附上链接:
Android 关于IPC机制的理解(一)
Android 关于IPC机制的理解(二)
虽然文章有但是还是要再说说AIDL,作为拓展我列下这个问题并解答
什么是AIDL,以及如何使用,能处理什么类型的数据?
AIDL(Android interface definition Language ),Android 接口定义语言,
使用aidl可以帮助我们发布以及调用远程服务,实现跨进程通信。
使用:AS中,在Main目录下右键新建一个aidl文件,然后修改这个文件的方法,还上自己业务需求的方法,然后Build->Make Project(快捷键Ctrl+F9)
然后在gen目录就生成了对应的接口文件。然后通过bindSerVice方法绑定远程服务,在bindService中有一个ServiceConnec接口,覆写该类的onServiceConnected(ComponentName,IBinder)方法,这个方法的第二个参数IBinder对象其实就是已经在aidl中定义的接口,因此我们可以将IBinder对象强制转换为aidl中的接口类。然后通过IBinder获取到的对象(也就是aidl文件生成的接口)其实是系统产生的代理对象,该代理对象既可以跟我们的进程通信,又可以跟远程进程通信,作为一个中间的角色实现了进程间通信。
AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。

Q、应用程序使用了多进程时怎么调用同一个Application的方法
这个问题是最后快要结束面试的时候面试官抛出来的,太急我也没记得大概什么意思,反正就是多进程操作Application的问题,这其实是他挖的一个坑,主要是想看你掉不掉里面了,采用多进程时一个新进程启动Android会分配一个新的虚拟机并划分新的内存地址,内存地址都不同了Application肯定不是同一个了,所以多进程时Application也会多次创建,不是同一个Application肯定操作的方法就不一样了,把这点跟他说了也就可以了

Q、说说Java线程池策略
这个就把线程池的几个参数跟他说清楚,然后把Java提供的几种线程池策略说一下,然后再说一下自己封装的线程池策略就可以了,讲真,面试官真不是我亲戚..也不是我特意又要贴我的文章的..但是我前面确实详细的在文章里解析过了..
Android 关于线程池的理解

Q、平常项目中用过ContentProvider吗
这个你要答没用过感觉就麻烦了,当然也是看业务需求,某些项目中也确实用不上,但是没用上也一定要说做过深入了解,毕竟四大组件之一..要点就是把ContentProvider的应用场景说一下,要是熟悉就再扯深入点,不熟悉就答到上面的程度也差不多了。如果深入可能他会这么问:
ContentProvider是怎么实现数据共享的
ContentProvider对外提供了url地址,并且提供了增删改查方法,其他应用通过contentresolver调用ContentProvider对外的增删改查方法就可以去操作数据库了。

Q、未来三到五年的规划
本来自己也喜欢Android开发,所以就说还是往开发层面去发展…

Q、我想问你的问题已经问完了你有什么想问我的吗
问到这里其实我猜这个工作已经十有八九拿到手了,因为事先了解过公司的待遇,期望薪水也写在了面试单上,所以这时为了突出自己技术屌丝的身份气质得多问下项目进度,项目团队,公司状况,之类的,问完这些之后他就说他去找项目的总监来面试我了,叫我等下。

Q、平常用什么管理代码
SVN,但是偶尔写博客会把代码用git传到github。

Q、为什么要离职
这是第二个面试官问我的,把离职原因跟他说一下就好了,注意的是原因千万不能说上家公司不好,也不能说工资不合适(虽然大多是这个情况..),多往自己身上找原因,但是也不能说自己很大的问题,不然人家也不敢录用你…反正就是有个度,比如我是因为公司要去外地驻点了,我暂时没有去外地工作的打算,所以在项目交付之后就跟领导提出了辞呈申请,注意千万不能说项目没完成自己就走了之类的话,这样会给别人你不负责任的印象..反正这些跟情商之类的有关,正常人多注意也就没什么了。

Q、我想问你的问题已经问完了你有什么想问我的吗
关于我想知道的在上一个面试官那里已经问过了,我暂时没什么想问的了

Q、我看你简历上写了期望薪水是XXX,跟你上个公司的跨度有点大,而且你才毕业一年我们恐怕给不了你这么多,你能接受的最低的薪水是多少
我当时就觉得我傻逼了..居然如实的写了我在上家公司的工资..然后想想这确实跨度大了很多,没办法我最后说了一个比期望薪水少两千的工资(T_T),


广州XX科技有限公司

一些废话:这个公司在另个区,怕迟到面完上家公司我就直接赶过去,午饭都没吃,这是一个做电子商务的公司,环境我也比较喜欢,很静,周边没什么公司,但是离地铁口很近,上班也方便,公司里面已经有两个Android了,面试我的是一个项目组长,他也是搞Android的,面了估计一个半小时…最后他还叫我去用他电脑做个机试题,机试题也不难,但是要花点时间,我当时很累看了下机试题没做就跟他说了下大概思路然后说我不想做想回去睡觉,能跟他说这些话是因为我跟他前面聊了很久,氛围也很好,而且我真的很累,饭都没吃,然后当时我已经知道第一家已经要我了,而他能给我的工资比第一家还低那么一点点,所以就有底气不机试了,因为聊得不错我也跟他说了这些情况,最后他把我送到了电梯口然后帮我按了电梯(感觉受到了莫大的尊重),然后我回去之后收到了他的短信,大意是叫我明天再去跟他老板面试,工资我可以直接跟他老板接着谈..最后我会贴上短信..

面试(摘选)

这公司是没有笔试的(这个好),填完资料直接面试了,首先也是自我介绍什么的,然后就是面试问题和回答了。有些问的问题是跟第一个公司一样的,我也一起列出来

Q、Java线程池策略
同上面的问题一样..

Q、对MVP有了解吗,它跟MVC的区别是什么
MVP是MVC的进化版,或者说是适应Android版,让Model和View完全解耦,在MVC中

  • Model:业务逻辑和实体模型
  • View:布局文件
  • Controller:Activity

我们知道布局能做的事情并不多,只是界面的显示而布局文件中的数据展示控件的点击事件等等都是在Activity中进行的,事件处理的代码都在Activity中,这就使得Activity既像View又像Controller,所以仍然解决不了代码耦合度的问题,所以把程序架构设计成MVP之后变成了

  • Model :业务逻辑和实体模型
  • View :Activity,负责View的绘制以及与用户交互
  • Presenter :负责完成View和Model间的交互

MVP架构减少了Activity的职责,简化了Activity中的代码,将复杂的逻辑代码放到Presenter层中进行处理。这样的层次划分使得代码的耦合度降低很多,也便于维护了。
然后他接着问了有没有用过MVP架构去写过项目
我因为确实没用过,就如实跟他说只是做过demo并没有应用到自己的项目中(关于类似这些一定要如实说,没用过就老实说没用过,千万不要没用过说用过然后他追问下去回答不出)
然后他接着追问了既然MVP优势这么明显你却不应用到项目中
我当时说的是项目是两个人开发的,项目架构的选型不是我定的,如果以后只有我一个人开发的时候我可能会选择用这个架构思想去设计或重构项目。

Q、听说过RxJava和RxAndroid吗
听说过
用过吗
没用过(真的是停留在听说过的环节..),但是看网上评论好像不错的样子,以后有时间一定研究研究
既然你听说过但是为什么不去做个Demo了解下
这两个名词是在我前不久无意中看到的,但是当时正在赶项目没注意到,后面项目完了离职要交接项目跟准备面试,所以没得深入进行了解,等我过段时间稳定了就去研究研究。其实从技术来说,时不时就会出一些我们没接触的新东西,不知道是很正常的,不知道就老老实实跟人家说不知道就好了,但是要给人家一个你现在不知道,但是你以后有时间会去研究的印象,毕竟我们是技术型屌丝不是。

Q、了解过热修复吗
了解过
那你跟我说说他的原理是什么
其实我也没实际用过热修复,就是之前了解过大概原理,所以就把我了解的跟他说了,具体可以参考这两篇文章
安卓App热补丁动态修复技术介绍
Android 热补丁动态修复框架小结

Q、以前有用到什么加密技术吗
这个至少MD5加密要说出来的,还有什么对称非对称加密,比如用户名跟密码可以用md5加密用sharepreference保存本地避免二次登陆之类的,然后还有什么公司自己的加密算法之类的(如果有)
如果这块熟悉可以接着说优缺点之类的,为了方便我这里总结了个常用的加密(其实用不上说这么详细,但是可以跟面试官说说,没兴趣直接跳到下一题..)
加密:对称加密、非对称加密
1. 能否通过一个密码进行加密和解密的操作,如果能就是对称加密。
对称加密
2. 对称加密都有密码。
3. 常用的加密方式DES, AES

DES 通过密码,对数据进行大量循环方式的异或操作,从而生成加密后的数据。DES对数据依次进行加密,一次加密是8个字节一起,因此,DES密码,必须是64bit,也就是8个字节
DES加密实现
1. DES加密之后的数据,不能够直接生成字符串的;
2. 加密: M 明文, K 12345678, D 加密后数据
D = DES(M, K) 用K密码对M进行加密生成D
3. 解密:M = DES(D, K)
4. 这种可以通过相同的密码进行加密和解密的叫做对称加密。
DES API
1. Cipher 加密/解密引擎,用于实际的处理
2. cipher.init(int mode, Key key) 设置加密还是解密
3. Key 对于DES需要使用 SecretKeyFactory 进行密码创建
创建密码对象用的是 DESKeySpec
4. Cipher update(byte[]) 每次调用都会返回一部分处理的数据,DES API doFinal 就只能返回最后一次的数据,不是完整的,
5. DES 加密推荐使用 doFinal 来完成。
DESede 加密方式
对于DES 或者 DESede 而言,如果实现DESede的话,那么:Cipher 算法调整为 DESede,SecretKeyFactory制定的算法,同样调整为 DESede, 其中需要使用 DESedeKeySpec 生成密码,而且密码的长度 24个字节。
AES 加密算法
1. 速度快
2. 强度高
3. Java中默认支持 AES 128bit 加密
AES 256bit 美国军方的标准;
AES 256bit 需要美国出口许可证才可以用。
DES, AES 特性 - 分块加密
Padding: 加密的时候,分块是数据按照固定长度一块一块处理,可以通过 Cipher 参数进行分块的控制
NoPadding:如果数据不是块长度的倍数,那么不会填充
一般情况下,填充会自动向数据后面添加 字节0 补齐
AES 常用的Cipher算法
1. AES 默认可以使用,有时也会出现BadPaddingException,不建议使用
2. AES/ECB/PKCS5Padding 另外一种AES 加密形式,建议使用
3. AES/CBC/PKCS5Padding 内部的算法模式不同。
4.算法及密码长度限制
算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度
AES/CBC/NoPadding 16 不支持
AES/CBC/PKCS5Padding 32 16
AES/CBC/ISO10126Padding 32 16
AES/CFB/NoPadding 16 原始数据长度
AES/CFB/PKCS5Padding 32 16
AES/CFB/ISO10126Padding 32 16
AES/ECB/NoPadding 16 不支持
AES/ECB/PKCS5Padding 32 16
AES/ECB/ISO10126Padding 32 16
AES/OFB/NoPadding 16 原始数据长度
AES/OFB/PKCS5Padding 32 16
AES/OFB/ISO10126Padding 32 16
AES/PCBC/NoPadding 16 不支持
AES/PCBC/PKCS5Padding 32 16
AES/PCBC/ISO10126Padding 32 16
AES API
1. Cipher 加密/解密引擎
2. 创建密码生成器 KeyGenerator,设置密码生成的密码长度 128 bit和设备安全随机数 ,
如keyGenerator.init(128, new SecureRandom(password.getBytes()));
3.生成 SecretKey keyGenerator.generateKey()
4. 初始化 引擎 cipher.init(Cipher.ENCRYPT_MODE, secretKey)
5. 加密处理 cipher.doFinal(byte[] origData)
非对称加密算法
加密实现
1. M 明文 D 公钥 E 密钥 C 密文 n 公共模数 0x10001
2. C = M ^ E mod n
3. M = C ^ D mod n
4. 通常 E + n 作为 私钥隐秘保存
5. 通常 D + n 作为公钥,可以给任何人。
6. 通过 C ^ D mon => M
7. E 通过计算两个 1024bit 以上的整数(并且是素数),
公钥 D = (素数1 - 1) * (素数2 - 1) E 包含两个素数
D 安全性足够高
非对称加密的API
1. Cipher 可以进行加密,用的是 “RSA”, “DSA”
2. KeyPairGenerator 生成 公钥和私钥
3. cipher init 加密用 私钥, init 解密 用的是公钥初始化。
加密实现
1. M 明文 D 公钥 E 密钥 C 密文 n 公共模数 0x10001
2. C = M ^ E mod n
3. M = C ^ D mod n
4. 通常 E + n 作为 私钥隐秘保存
5. 通常 D + n 作为公钥,可以给任何人。
6. 通过 C ^ D mon => M
7. E 通过计算两个 1024bit 以上的整数(并且是素数),
公钥 D = (素数1 - 1) * (素数2 - 1) E 包含两个素数
D 安全性足够高
非对称加密的API
1. Cipher 可以进行加密,用的是 “RSA”, “DSA”
2. KeyPairGenerator 生成 公钥和私钥
3. cipher init 加密用 私钥, init 解密 用的是公钥初始化。
Base64、MD5编码
android.util.Base64类
encode(byte[],flag)
encodeToString(byte[],flag) 编码并转换成字符串
decode(byte[],flag) 解码
flags标识
Base64.DEFAULT 默认,如果字符串过长(超过76)时自动在中间加一个换行符,字符串最后也会加一个换行符。可能会导致和其他模块对接时结果不一致,建议使用Base64.NO_WRAP
Base64.NO_WRAP 不换行处理
Base64.NO_PADDING 结束位置省略“==”
it.sauronsoftware.base64.Base64类
第三方Base64编码、解码工具类
Base64.decode(byte[]);
Base64.encode(byte[])

Q、说说Android的消息机制
这个问题我前面专门写过博客..
Android消息机制详细解析

机试

附上机试题:
Android面试总结(不定时更新版)

就是一个listview,上面的数据是json格式的,然后给你接口地址,点击全选就把所有的checkbox都选上,然后把价格也显示,其实不难,也是很常用的一个功能,有兴趣的可以自己做一下,没有眉头的可以看下面的文章
带checkbox的ListView实现(二)——自定义Checkable控件的实现方法

最后附上面试官短信证明面试真实有效..
Android面试总结(不定时更新版)


广州XX科技有限公司

一些废话:其实我一开始就没打算去这个公司,只是好久不面试了,去涨点经验而已,不打算的原因是因为公司是大小周的,我入职其实没什么大的要求,但是不能是大小周的,因为我感觉一周上五天其实已经很疲乏了,周末还要上班就感觉受不了了,这公司居然大学城,我去了感觉太喜欢这个环境了,树很多环境很好,人也不多,离地铁口很近,而且最主要的是人事妹子说中午可以去附近的几个大学饭堂吃午饭!!!!这太诱惑了有没有,大学饭堂意味着什么,意味着便宜好吃的美食!!你们以为我想表达妹子多吗,太肤浅了!!(同学你好我是附近学校的学生你可以告诉我饭堂怎么走吗,噢噢,你也刚好要去吃饭啊,我没有饭卡可以先刷你的然后我微信转账给你吗,可以啊,那谢谢了哈
Android面试总结(不定时更新版)

PS当年在学校读书我真的用类似方式搭讪过漂亮妹子(坏笑脸)),咳咳,回到主题,其实这家公司除了大小周这个我不喜欢之外还有个面试官跟我说他们项目很多也会很赶,加班是常事,最厉害的他见过一个同事加班到第二天早上七点..但是压力越大回报也越大,他们的有年底双薪,年终奖看项目情况大概是8-22个月薪水,因为我没打算去这个公司所以当时问我期望薪水我说了很高的数字,但是最后还是没去,因为我怕自己扛不住,6号人事打电话给我说我被录用了当时问我愿不愿意,我还真多犹豫了下,最后还是跟她说不去了,其实我应该说去的,这样她就发录用邮件给我了,大学毕业一年了,第一次收到工资这么高的工作,邮件保存下来也好啊…

笔试(摘选)

Q、请描述一下广播的注册方式
1. 静态注册,在清单文件中注册,这种注册方式属于常驻型注册,就是即使应用在退出状态一旦系统有相关的广播发送也会进行接收处理,这种注册方式在使用时要考虑清楚,毕竟常驻去监听系统广播这样会消耗系统资源什么的。
2. 在代码中动态注册,这种注册方式一般跟随Activity生命周期或App开启与否,通过registerReceiver去注册监听,unregisterReceiver去解除监听。这种注册方式也是我们项目中常用的注册监听广播方式。

Q、在Service的生命周期方法onStartCommand()可不可以执行网络操作?如何在Service中执行网络操作?
可以在这个方法里执行网络操作,在Service中执行网络操作跟在Activity或Fragment中执行网络操作方法是一样的。

Q、调用下面的方法,得到的返回值是什么

  public int getNum() {
try {
int i = 1 / 0;
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}

这是道经典面试题,返回值是3,首先代码执行第三行,这里会报一个错误MathException,但是trycatch了,所以会走到catch代码段,所以第四行不会执行,然后在catch里面有个return方法,异常机制有个原则,就是在catch中有return或者其他异常(比如这里把return 2换成 int j = 1/0又产生一个异常)让函数终止的话,那么如果有finally代码块,finally代码块就必须先执行完然后再执行catch代码段,但是这题在finally里面return了,所以就没有机会执行到catch代码段了。如果finally代码执行的是其他(释放资源等)操作时,最后返回的还是catch代码段的2.

Q、页面上现有ProgressBar控件,请用线程以10秒的时间完成其进度显示工作(核心代码)

 public class MainActivity extends AppCompatActivity {
private static final int FLAG = 1;
private ProgressBar pb;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == FLAG)
pb.setProgress(msg.arg1);

}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pb = (ProgressBar) findViewById(R.id.pb);
pb.setMax(10);
progressShow();
}

private void progressShow() {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <= 10; i++) {
Message msg = mHandler.obtainMessage();
msg.what = FLAG;
msg.arg1 = i;
SystemClock.sleep(1000);
mHandler.sendMessage(msg);
}
}
}).start();
}

面试

Q、Java线程池策略
同上面的问题一样..

Q、说说Android的消息机制
同上面的问题一样…

Q、Thread和AsyncTask的区别
其实懂得了线程池策略,就跟面试官说AsyncTask使用的线程池策略是什么,它内部封装了三个方法,然后说下Thread更新是加上Handler进行UI更新的,我当时说的就是上面两种区别了。

Q、Fragment和Activity之间是如何传值的?
Fragment和Activity绑定之后,在Fragment中可以直接通过getActivity()方法获取到绑定的Activity对象,这样就可以调用Activity的方法了,也就可以获取Activity的值。
而Activity要想获取Fragment的值可以使用

  getFragmentManager().findFragmentById();
getFragmentManager().findFragmentByTag();

这两个方法来获取Fragment的实例然后获取Fragment的方法。
如果是一个Activity绑定的Fragment想要传值到另一个Activity,那就在先把值传到绑定Activity然后getActivity().startActivity时通过Intent进行传值。

Q、介绍一下你做能够体现你符合期望薪水的app
我当时把自己做过的app都演示给他看了,说了说开发模块的时候碰到什么问题怎么解决之类的。

Q、遇到过OOM吗
遇到过(这你要说没遇到过就..),在XX项目前期加载多图的时候
怎么处理的
OOM异常算比较常见的问题。Android系统为每一个应用分配一个虚拟机,虚拟机的默认堆内存只有16M(手机配置不同分配的有可能不同),,所以很容易导致OOM异常的产生。导致这样的异常主要有以下原因:
1、加载大或数量过多的图片没有进行图片压缩操作;
2、操作数据库的时候游标(Cursor)没有关闭
3、io流,file流资源未释放
4、内存泄露。
第一种可以自己把图片进行压缩也可以使用市面上的第三方库去加载,后面三个经常review并优化代码可以解决,当然内存泄露可以使用性能分析工具来检查。

Q、以前项目的任务分工是怎么样的
这个如实说就好了
Q、独立开发过app吗
有过
Q、如果叫你独立开发一个app你觉得大概需要多久
我当时觉得问这个问题很业余啊…app的复杂程度,跟后台协商数据的时间长短,产品提的需求明不明确等等都会影响项目周期,这些问题没搞清楚我怎么知道会花多久..
Q、集成过微信支付吗,如果叫你集成大概花多久
只集成过支付宝支付,微信支付以前项目没集成过,如果让我来集成我可能得先看微信的开发文档和提供的demo才能告诉您大概多久,但是如果公司急着要这个模块我可以加班加点尽快做出来。

Q、为什么离职
上面分析过这个问题了..

Q、有什么想问我的吗
同上…


广州XXX科技有限公司

一些废话:Android的市场现在真的不得了,我陆续投了一百六十多份简历,也才四个公司叫我去面试,要换平常这个公司我面试都不会去,因为没有人事跟我商量过时间,是直接发邮件叫我哪天哪个时间段去面试的,但是因为面试前一天都没收到面试呆在宿舍也没事干,所以还是去面试了,因为上面说的,我觉得我没受到尊重所以我一开始也是不打算去这个公司的,去了以后发现如我所想,是一个大公司下属的创业团队,面试官一直跟我说融到资我的薪水就可以翻一翻,但是我发现他们很多东西都不完善,就连这个最基本的面试,人事打个电话跟我约时间很难吗,然后去了的时候发现面试官在开会..然后我就在外面等了估计二三十分钟,我其实也不是不能等,但是你要是开会可以跟我约迟一点的时间不是..不吐槽了..

面试

面试官不懂技术,然后叫我看了他们的项目,然后有什么问题,我看了看,很多明显的错误,首页viewpager滑动不了,ScrollView滑动有问题,,我当时就想这样的版本居然也上线了,,然后后面我才知道,他们没有测试,,一个产品身兼测试,跟开发者自己也测试,,其实这个面试是可以忽略的,因为这是一个不同层级的面试,我一个Android开发,跟他一个不懂技术的面试官,我就指出我看到的问题,然后告诉他如果是我我的解决方案,说完以后大概我觉得就差不多了,然后他跟我说他们公司的情况,什么创业团队啦,提薪的方式只有融到资啦,只有五险没有一金之类的,然后最后他问我是不是不会考虑他们公司,我就直接说是的,,然后就没有然后了,我这么做也是有考量的,当时他们的Android开发还没有辞退,然后他说我进去了就会辞退他,但是通过这个面试我感觉他们有太多的不完善,这开发有责任但是没有测试,没有直接领导去监督项目,双方都有责任的,所以有时候准备很充分不一定用上。其实碰上不懂技术的面试官是一件矛盾的事,你不会跟他在技术上面擦出任何火花,但是对于工作而言你又很容易进入这家公司,但是我觉得如果面试官不懂技术那么他能给你的薪水或者你工作的内容可能就不那么重要了。这其中的取舍因人而异..


第一次总结

其实我的面试经验并不多,在经验总结上也只能根据自己的想法来了,但是在我面了几次之后发现面试的很多问题是重复的,也就是可能我这次面试说得不好,但是我总结好下次面试再碰到这个问题我就能从容回答了,我觉得在技术面的时候要多给人一个你是对技术有追求、基础也很扎实的人,哪怕某些东西你不懂,但是你要给别人感觉你会自己去学,然后去掌握不懂的东西,然后平常周末或者闲的时候可以去学学新的东西,我在面试的时候对某些技术可以说是一脸萌币的,但是我过后有时间肯定是去了解的,技术日新月异,人也要与时俱进才得,毕竟程序员不进步很容易就被淘汰了,最后我觉得面试成功的关键在于跟面试官在技术上擦出火花,这样工作就比较好拿到了,如果碰到不懂技术的面试官..,这个就没什么好说的了,这种就很好过了,因为在技术层面来说,我们跟他是不一样量级的…


第二次前言

昨天(2016.9.22)第一次当面试官面试别的Android程序员,因为角色的转换发现一些问题,突然想总结一下当面试官的一些体会(其实是想吐槽 - -!),所以就续写了这篇文章。面试的回答是我想问的原因有些问题我不记得当时面试者是怎么回答得,但是我写了我为什么问和要是回答了我会怎么问。当时我问问题时比较随意,文章也写得比较随意,轻喷..


面试者一

面试结果:不通过
一些废话:这是我当面试官第一次面试的人啊,我多希望是个美女啊,因为第一次会铭记在心有没有!!!但是没错,是个男的…讲真,他最后说期望这个薪水的时候我是抗拒的,我终于知道为什么Android市场越来越不景气了,因为市场全被搞坏了啊..通过面试以我直观接触(虽然不够了解或者片面)他的能力跟这个期望薪水存在一定(蛮大..)的差距,我不知道他为什么最后会说出这个价格,他是觉得我问他的问题回答得很好还是很自信啊,我过后一直疑惑..

面试过程

上来开场白肯定是叫他自我介绍了(具体可以参考上面的流程(套路)),我想了解的无非就是你是哪里的,原来在哪里工作,是搞Android不,开发的app类型(虽然简历上有),当然最后说点客套话更好。其实这时候语气自然点最好了。
由于第一次面试,我也不知道问点什么,就想照着他简历细问点东西,但是我发现他连简历写的东西都没弄明白,我下面记录下大概问的问题;
Q、你用什么网络框架跟服务器交互
PS:问这个问题是因为我见他几个app都写的xUtils并没有用到别的框架,这是让我很疑惑的事,因为照一个两年开发广州经验的程序员来说,不应该只使用了这一种框架,也不应该较多的使用这种聚合型框架,因为大而全就是这些框架的问题,xUtils的四个模块看似很全,但是就是因为全它们的耦合性也就高了,直观点就从github上的星星也可以看出来,xUtils是两千多颗吧,但是同样的联网框架okhttp是一万四千多颗,但是也有种可能,公司上头决定的,经过自己阉割后使用,这样也说得过去,当然也不是说就不能用xUtils,以上是个人看法,然后我大概也知道他会说xUtils。
Q、你用过别的框架吗
“没有…”对,没错,你没看错,就是说没有,然后我问okhttp你听说过吗,“没有…”对,真的是没有…我当时觉得我不知道该怎么问了,因为再问也觉得是浪费大家时间,毕竟你写了两年工作经验,我不知道怎么问了,我要是问市面上有很多其他优秀的框架为什么不去学习我也怕他回答得很尴尬,所以为了避免这个问题我就问了点简单的缓解气氛。
Q、你说下Activity的生命周期吧
我当时就想这个问题都回答不出来就说不过去了吧,但是他回答是回答了,把几个生命周期都说出来了,但是我还是不怎么满意,我希望的是结合实际说一下而不是把方法背出来,举个栗子你可以这样回答:当我按home键的时候会回调什么方法,然后当我从后台返回这个Activity的时候又回调什么方法。本来我还想接着Activity问下比如异常情况下保存状态跟横竖屏时生命周期会怎样,要是回答好了我可能还会接着问Activity启动流程,四种启动模式什么的,但是回答我不是很满意也就没问下去。
Q、知道Android的消息机制吗
这个问题要是回答不知道我就尴尬了,但是幸好他回答知道,然后说了下大概的使用,然后我觉得他是懂的,所以我就想问他下实现原理,他不知道怎么回答支支吾吾,然后我也没问下去,这个问题他要是能把Handler及其附带的MessageQueue、Looper以及Message的工作流程说个大概我可能会接着问他源码实现,其实正常来说能回答到第二层也就可以了,源码层不理解也没什么,但是第二层没回答上来我也就没问下去,不过也不要紧,看他期望薪水了。
Q、看你简历写了熟练掌握MVC架构那你能跟我说说它是什么吗
其实我疑惑的是他只写了MVC并没有写MVP,从Android角度来说如有真要用这两种架构,MVP比MVC更适合开发,甚至说MVC不适合Android开发,原因上文大概说了下。然后它跟我说了下MVC但是并没有说清楚,我问他用过MVC架构开发过项目过吗,他说用过,然后我问他觉得怎样,他说不错..然后我说知道MVP吗,他说不知道,当时我对他已经五体投地了..也就没接着问下去,再问也是尴尬。

Q、了解Android事件分发机制吗
这个问题其实是消耗时间的,毕竟总不能面试个十分钟就说回去等通知吧,其实到这里我已经没什么兴趣问下去了,所以他回答什么我也都无所谓了,但是他说了解,但是又说不清..


面试者二

面试结果:等待领导决定
一些废话:这次面试其实我也不是很满意,但是开的薪水对于公司来说相对合理,领导面的时候觉得他还可以,打算看看下周有没有更合适的再考虑。

面试过程

Q、自我介绍
肯定以这个开始..
Q、说说Activity生命周期吧
然后就是围绕Activity问了一系列问题,回答得一般吧
Q、平常项目中使用过多进程吗
这个问题回答是与否都无所谓因为要是你说用过我会问为什么用然后问你多进程,回答没用过我也会问你了解过多进程吗,要是回答了解会接着问跨进程通信的几种方式,当然你要是说没用过也不知道多进程我也就不问了..
Q、了解自定义View吗
这个问题你要是回答不了解我就得等期望薪水来谈了..要是说了解接着问view的绘制流程、滑动原理 、滑动冲突时怎么解决

还有蛮多懒得写了…….


面试者三

面试结果:不通过
一些废话:其实我很想吐槽这个同学的,态度实在是差,首先昨天面试的人很多,然后他就等了大概十分钟吧,然后态度是各种差,有个人先来的,然后就先面试第二个人了,然后他也跟着出去,然后就叫他先回去等下,他居然问了要等多久..还是态度很不耐烦的..昨天下班我跟一个同事走路去地铁站,当时他就说当时叫那个人别跟出去在办公室等等,那个人没理他..他就说那个人难相处,然后面试过程我觉得我跟他角色是不是互换了..感觉我的态度都比他好了不知道多少个档次啊..而且我去,两年工作经验,也是只用过xUtils,okhttp是什么也不知道,一些浅显的基础问题也回答不出,我当时就无语了啊,而且还一脸拽样问我们公司是不是外包公司,他是不可能去外包公司的,注意啊,是“不可能”啊,是态度很坚定的,然后我说我们不是外包公司,而且全程一脸大神样啊..但是技术是个渣啊..然后我们领导过后也跟我说觉得他态度很差,不考虑他,我其实不知道他为什么戾气这么重啊..真的是,最后象征性谈了下然后最后问他还有什么问题,他居然说我还有最后一个问题:他不考虑我们公司了,可以把他的简历还给他吗,我当时就哔了狗了,感觉一口老血要吐出来了,他不考虑我们我们也没考虑过他啊,他是哪里来的自信..还有居然很拽的拿回简历啊..我去啊,顿时感觉世界真奇妙啊,真心什么人都有啊..我自认我待人什么的都是很友善的..问问题的方式也是很愉快的,就算某些不会我也不会表现出来什么表情,但是我实在想不通为什么他这样..


第二次总结

其实昨天面试的感觉都不是很满意,特别第三个,技术渣也就算了,情商还低..也是服,不过我觉得现在Android市场人员真是参差不齐,我们公司开的薪水是比较高的,我以为会可以筛选掉一些人,但是面了之后发现我想得太多了,第一个的简历写项目的时候居然敢写几百万下载量的app啊,而且人家是北京的公司他写自己在深圳工作的啊..而且公司名都不对..也是真敢写..还有对一些本该了解的东西却不了解, 然后情商很重要!!情商很重要!!情商很重要!!重要的事说三遍,倒不是说情商要多高,就是你至少跟人相处没问题吧,别说什么程序员不懂表达,不懂表达跟态度恶劣是两回事..你说我们之前不认识但是至少在短暂面试的时候你至少得态度和悦点跟我相处吧..对了,还有简历千万别留QQ邮箱…
回到总结,其实我也是第一次面试别人,问的问题也很随意,上面的问题也不是问的全部问题,其实还有蛮多,只是我觉得来来去去都是这些问题就懒得写了,我觉得有些公司的面试官可能也跟我类似吧,先问些浅的问题,然后看你回答,然后围绕这个问题细问些东西,看你回答到什么层面。其次面试官的主观意识很重要,所以回答的时候尽量自信自然,态度好点,不是说要笑嘻嘻但是至少得给人一种友善的意图吧,写到这里我也不知道写了什么..我希望看到我这篇文章的人可以从中得到些许收获,至于里面有些言语不当的看看也就过了别当真(微笑脸)。