Android面试 纸上谈兵系列

作者-焕然一璐,支持原创,转载请注明出处,谢谢合作。 原文链接:http://www.jianshu.com/p/8500d42e3c91

技术面

一、自我介绍一下吧

我是来自广东工业大学信息工程学院的吴焕楠,焕然一新的焕,木字边加东南西北的楠,我来应聘的岗位是android开发工程师。大二开始自学android开发,看的是淘宝网买的一套黑马程序员的视频教程,后来又在菜鸟窝官网学习了一套叫做《菜鸟商城》的实战视频教程,后期主要是靠实习和看书,看博客来提升自己的技术水平。

二、在什么地方实习过?实习多久?平时主要做什么?离职了吗?为什么离职?

是这样的,我是在今年3月份开始在悦乎网络科技有限公司实习的,一直到九月份才离职,一共工作了6个月。这家公司是一家创业型公司,规模比较小,但是基本所有功能模块都是自己独立完成的,这样可以有更多锻炼自己的机会。但是毕竟是实习,薪水只能满足于生活费用,现在觉得自己的水平已经有一定提升,因此想得到贵公司的认可。

平时主要的任务就是负责开发《师兄帮帮》APP的各种功能模块的调研,开发以及日常的升级与维护。

三、能不能简单介绍一下你做过的APP?

《师兄帮帮》是一款垂直社交应用平台,这款产品主打是大学生,里面有20万份资料供用户阅读查看和下载。用户可以在这个平台上发布问题或者需要,也可以进行抢单,解决问题以后就有相应的报酬。

四、你在开发这个APP的时候你遇到过的技术难点有什么?你是怎么解决的?(重点问题)

1、 首先要说的问题就是APP内部查阅资料的问题。资料有word、excel、ppt、PDF、图片等格式。由于PDF和大图的查看网上有很多成熟的解决方案。但是谷歌官方并没有在android原生平台查看office文档的功能,相对来说IOS的浏览器内核Safari是支持直接打开office文档的。

解决:因此只能找第三方解决方案。当时考虑过使用Apache的POI,但是发现这个库主要是java方向的,对于android的兼容性做得不是很好。也考虑过使用韩国的一款office SDK,叫做北极星Office,但是后来考虑到这个SDK收费太贵所以没有使用。最后是决定采用使用Web Office服务,有服务动态生成office文档的url,用android的WebView来加载和浏览。

2、 第二个要说的就是沉浸式状态栏的实现。这个问题比较尴尬,因为我们的标题栏是白色的,因此如果直接设置状态栏的颜色为白色的话,那么原有的状态栏上面的文字是白色的话就看不见了。

解决:目前来说只有小米、魅族以及android6.0以上才提供了设置状态栏字体颜色的API。考虑到兼容性问题,只能参考市面上的一些app,把状态栏设置为半透明的黑色。使用了github上面的一个开源库system bar tint,并且在app主题中开启了透明状态栏。

3、 短信验证码的自动填写。

解决:使用Content Observer去观察短信数据库的收件箱,当有新的短信进来的时候,就通过正则表达式去获取短信中的验证码,并且通过handler把结果传递到UI中。

4、 动态库文件(so文件)冲突:由于当时想引入Fresco图片缓存框架,但是后来发现由于Fresco框架对不同架构的平台的支持得非常好,提供了所有平台的so包,但是这样会导致app不能正确加载其他库(如短信验证SDK)的so库,从而引发crash。

解决:当时是看到Stack Overflow上的一篇博客介绍,通过配置APP的gradle脚本文件,使得app只输出armabi架构的so包,成功解决问题。

5、 实现防止多终端登录同一个账号的时候,服务器需要知道用户是否正在登录app。

解决:通过后台开一个Service,每隔一段时间去访问服务端的一个心跳接口,从而告诉服务端app的某个账号正在使用。

6、 使用第三方SDK的时候,例如融云即使聊天、Ping++的时候,遇到问题一般都是通过提交工单的方式去寻求解决。

五、你说你看过好多书,能不能简单介绍一下你看过什么书?平时看什么博客?自己写过博客吗?

《android源码设计模式解析与实战》,这是一本介绍了设计原则、设计模式以及android源码的一本书。

《android群英传》,《android开发艺术探索》,《android开发从小工到专家》,这些都是android方面的技术进阶书籍,从各个方面介绍android开发中的一些常见的难点。

《android神兵利器》,主要介绍了git、android studio等工具的使用,还没看完。

平时看的博客主要来源于CSDN,微信公众号等,自己有在简书上面写技术博客以及笔记。

六、你会不会使用反射技术?你是怎么理解这个技术的?在什么地方用过?

我对反射技术的理解就是,反射就是把Java类中的各种成分通过java的反射API映射成相应的Java类,得到这些类以后就可以对其进行使用。比如方法,构造方法,成员变量,类型,包等。

直接用到反射技术的不多,一般都是间接用到比较多。比如:

1、android中的通过读取布局文件的信息,然后利用反射来构造各种控件的对象。

2、使用开源ORM数据库框架的时候,是通过反射的方式来进行java Bean和表的映射的。

3、Gson在解析JSON并且生成Bean对象的时候利用了反射技术。

七、什么是设计模式?你知道哪些设计模式?简单介绍一下吧

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

单例模式,主要用在一些资源消耗比较多的类身上,比较典型的实现由DCL方式、枚举、静态内部类来实现。例子有

  1. SystemService
  2. 操作数据库的类,DataBaseOpenHelper
  3. 操作SharePreference的类
  4. 各种管理类,比如网络,图片加载器等等

Builder模式,主要是用作一些复杂类的构建,并且一般支持连点操作。例子:

  1. AlertDialog的构建
  2. ImageLoader等图片加载框架类的构建

Adapter模式:这种模式主要是解决接口不兼容的问题。例子:

我们常用的ListView、RecycleView等,就使用了adapter模式设计,这样做分离了ListView显示视图,Adapter提供数据以及操作的功能,负责单一职责原则。

观察者模式:这种模式是主要有被观察者、观察者组成,当被观察者的观察行为发上变化的时候,观察者可以马上做出相应处理。例子:

  1. Content Observer

  2. RXJava

  3. ListView、RecycleView在设置Adapter的时候也注册了数据观察者,当用户调用notifyDateSetChange等方法的时候,这些观察者就会通知这些控件去重新刷新视图。

工厂模式:主要是定义了一个对象创建的接口,具体产生什么类由用户去实现。例子:

  1. Activity中的onCreate方法,就是构造视图View的工厂方法
  2. Collection中的iterator方法
  3. Bitmap的创建也可以通过工厂方法

装饰者模式:动态地给一个对象添加一些额外的功能。例子:应用:IO流,ContextWrapper等。

八、Activity和Fragment之间你是怎么传值的?

  1. 通过findFragmentByTag或者getActivity获得对方的引用(强转)之后,再相互调用对方的public方法,但是这样做一是引入了“强转”的丑陋代码,另外两个类之间各自持有对方的强引用,耦合较大,容易造成内存泄漏。
  2. 通过Bundle的方法进行传值,并且在创建Fragment的时候通过setArguments方法把Bundle设置进去。
  3. 利用eventbus进行通信,这种方法实时性高,而且Activity与Fragment之间可以完全解耦。

九、简述一下android的消息传递机制吧。

Android中的消息机制主要是指Handler的运行机制。Handler是进行线程切换的关键,在主线程和子线程之间切换只是一种比较特殊的使用情景而已。其中消息传递机制需要了解的东西有Message、Handler、Looper、Looper里面的MessageQueue对象。我们可以把整个消息机制看作是一条流水线。其中:

  1. MessageQueue是传送带,负责Message队列的传送与管理
  2. Looper是流水线的发动机,不断地把消息从消息队列里面取出来,交给Handler来处理
  3. Message是每一件产品
  4. Handler就是工人。但是这么比喻不太恰当,因为发送以及最终处理Message的都是Handler

app在启动的时候,也就是执行ActivityThread的main方法的时候,会为主线程创建Looper,并且启动整个app的消息循环,同时保证app不会立马退出。

十、简述一下android的事件传递机制吧。遇到过(滑动)事件冲突吗?你是怎么解决的?

事件总是从上往下进行分发,即先到达Activity,再到达ViewGroup,再到达子View,如果没有任何成员消耗事件的话,事件会顺着路径往回传递。

  1. dispatchTouchEvent是事件的分发方法,如果事件能够到达该视图的话,就首先一定会调用,一般我们不会去修改这个方法。
  2. onInterceptTouchEvent是事件分发的核心方法,表示ViewGroup是否拦截事件,如果返回true表示拦截,在这之后ViewGroup的onTouchEvent会被调用,事件就不会往下传递。
  3. onTouchEvent是最低级的,在事件分发中最后被调用。
  4. 子View可以通过requestDisallowInterceptTouchEvent方法去请求父元素不要拦截。

遇到过事件冲突:就是ViewPager其中一个Pager上面的Banner,当Banner还没滑到最后一页的时候,应该请求ViewPager不要拦截自己的滑动事件;当Banner滑动到最后一页的时候,要请求ViewPager去拦截自己的滑动事件,从而使得ViewPager能够跟Banner配合工作。

十一、简要说说View的工作机制。有自定义过View吗?简要说说。

View的工作机制主要包括测量(Measure)和绘制(Draw),而对于ViewGroup来说还包括布局(Layout)。

测量主要是根据用户指定的测量大小以及模式通过setMeasuredDimension方法去设置View的大小。精确模式下需要返回用户指定的大小。最大值模式以及不明确指定的模式下,需要提供默认大小,在最大值模式下需要返回两者的最小值。

绘制主要是通过一些画图API比如画布画笔,在View区域上面动态画一些东西。

布局主要是自定义ViewGroup的时候实现的,主要是控制各个子View在ViewGroup的位置以及他们之间的关系。

//有待更新

十二、有没有(参与)写过(开源)框架?看过什么框架?底层怎么实现

//有待更新

十三、有没有关注一些新技术?

//有待更新

如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:

我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值