作者-焕然一璐,支持原创,转载请注明出处,谢谢合作。
原文链接: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方式、枚举、静态内部类来实现。例子有
- SystemService
- 操作数据库的类,DataBaseOpenHelper
- 操作SharePreference的类
- 各种管理类,比如网络,图片加载器等等
Builder模式,主要是用作一些复杂类的构建,并且一般支持连点操作。例子:
- AlertDialog的构建
- ImageLoader等图片加载框架类的构建
Adapter模式:这种模式主要是解决接口不兼容的问题。例子:
我们常用的ListView、RecycleView等,就使用了adapter模式设计,这样做分离了ListView显示视图,Adapter提供数据以及操作的功能,负责单一职责原则。
观察者模式:这种模式是主要有被观察者、观察者组成,当被观察者的观察行为发上变化的时候,观察者可以马上做出相应处理。例子:
Content Observer
RXJava
ListView、RecycleView在设置Adapter的时候也注册了数据观察者,当用户调用notifyDateSetChange等方法的时候,这些观察者就会通知这些控件去重新刷新视图。
工厂模式:主要是定义了一个对象创建的接口,具体产生什么类由用户去实现。例子:
- Activity中的onCreate方法,就是构造视图View的工厂方法
- Collection中的iterator方法
- Bitmap的创建也可以通过工厂方法
装饰者模式:动态地给一个对象添加一些额外的功能。例子:应用:IO流,ContextWrapper等。
八、Activity和Fragment之间你是怎么传值的?
- 通过findFragmentByTag或者getActivity获得对方的引用(强转)之后,再相互调用对方的public方法,但是这样做一是引入了“强转”的丑陋代码,另外两个类之间各自持有对方的强引用,耦合较大,容易造成内存泄漏。
- 通过Bundle的方法进行传值,并且在创建Fragment的时候通过setArguments方法把Bundle设置进去。
- 利用eventbus进行通信,这种方法实时性高,而且Activity与Fragment之间可以完全解耦。
九、简述一下android的消息传递机制吧。
Android中的消息机制主要是指Handler的运行机制。Handler是进行线程切换的关键,在主线程和子线程之间切换只是一种比较特殊的使用情景而已。其中消息传递机制需要了解的东西有Message、Handler、Looper、Looper里面的MessageQueue对象。我们可以把整个消息机制看作是一条流水线。其中:
- MessageQueue是传送带,负责Message队列的传送与管理
- Looper是流水线的发动机,不断地把消息从消息队列里面取出来,交给Handler来处理
- Message是每一件产品
- Handler就是工人。但是这么比喻不太恰当,因为发送以及最终处理Message的都是Handler
app在启动的时候,也就是执行ActivityThread的main方法的时候,会为主线程创建Looper,并且启动整个app的消息循环,同时保证app不会立马退出。
十、简述一下android的事件传递机制吧。遇到过(滑动)事件冲突吗?你是怎么解决的?
事件总是从上往下进行分发,即先到达Activity,再到达ViewGroup,再到达子View,如果没有任何成员消耗事件的话,事件会顺着路径往回传递。
- dispatchTouchEvent是事件的分发方法,如果事件能够到达该视图的话,就首先一定会调用,一般我们不会去修改这个方法。
- onInterceptTouchEvent是事件分发的核心方法,表示ViewGroup是否拦截事件,如果返回true表示拦截,在这之后ViewGroup的onTouchEvent会被调用,事件就不会往下传递。
- onTouchEvent是最低级的,在事件分发中最后被调用。
- 子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,我拉你进群交(♂)流(♀)。