以下纯属个人面试经验分享,望对各位同仁有帮助
本人基本情况是:16年毕业于211院校本科,19-21年在Oppo工作,算是有大厂经验了
面试的岗位是:
Android应用开发工程师
职位描述
1、负责手机端系统应用的功能开发,维护和问题修复;
2、负责所维护模块的性能优化,如冷热启动指标优化,滚动优化等;
3、负责所维护模块的内存问题处理,包括解决内存泄漏,内存调优等。
职位要求
1、本科以上学历,计算机或相关专业,3年以上Android实际开发经验
2、熟练掌握Java语言或C++语言,熟练掌握面向对象编程,熟悉Android平台的应用设计规范、具有良好的编程习惯和代码规范意识,熟悉Android平台下的代码调试和调优技术;
3、熟练掌握Android IPC 机制,熟练运用四大组件进行需求开发,有对Framework 如AMS,WMS了解的优先;
4、熟练掌握TCP, Http,Https等通讯协议,熟练使用OKHttp 或 Http其他工具类进行网络编程;
5、熟练掌握Android UI编程,动画编程,对Android事件分发流程,View绘制流程,自定义View 有较深理解;
6、有过Android系统级应用经验者优先;
7、了解并使用过开源框架或技术如 Rxjava,Retrofit,EventBus,Android JetPack,OpenGL,组件化开发经验者优先;
8、有技术亮点与技术热情,希望对某种技术有较深的研究,例如图形,网络,浏览器等;
9、具备积极进取踏实负责的工作态度,强烈的团队合作意识, 能承受工作压力。
面试过程
1、主要是项目经验(占面试时间的40%)
没有问所有项目,你自己挑一个最难的项目来讲
突出项目难点,项目特色,项目突出贡献,要做到通俗易懂,视频面试没法画框架图
2、突出三方能力,要了解核心思想(占面试时间的20%,如果用得多可能会聊更久)
比如:OkHttp,retrofit,RxJava,EventBus,
比如:OkHttp基本原理,缓存原理,连接池原理,
如果每个请求都需要在url里添加字段,如何用Interceptor实现
retrofit的核心设计思想
参考链接:
OkHttp缓存原理分析
okHttp使用和原理分析
3、android基础(占面试时间的20%)
3.1、Handler实现原理
参考链接:android Handler机制原理解析(一篇就够,包你形象而深刻)(https://blog.csdn.net/luoyingxing/article/details/86500542)
3.1.1、Looper.loop()源码,即实现原理
3.1.2、Handler.postDelay()实现原理
参考链接:你真的懂Handler.postDelayed()的原理吗?(https://blog.csdn.net/qingtiantianqing/article/details/72783952)
基本情况是:
如果头部的这个Message是有延迟而且延迟时间没到的(now < msg.when),会计算一下时间(保存为变量nextPollTimeoutMillis),
然后在循环开始的时候判断如果这个Message有延迟,就调用nativePollOnce(ptr, nextPollTimeoutMillis)进行阻塞。nativePollOnce()的作用类似与object.wait(),只不过是使用了Native的方法对这个线程精确时间的唤醒。
如果Message会阻塞MessageQueue的话,那么先postDelay10秒一个Runnable A,消息队列会一直阻塞,然后我再post一个Runnable B,B岂不是会等A执行完了再执行?正常使用时显然不是这样的,那么问题出在哪呢?
1、postDelay()一个10秒钟的Runnable A、消息进队,MessageQueue调用nativePollOnce()阻塞,Looper阻塞;
2、紧接着post()一个Runnable B、消息进队,判断现在A时间还没到、正在阻塞,把B插入消息队列的头部(A的前面),然后调用nativeWake()方法唤醒线程;
3、MessageQueue.next()方法被唤醒后,重新开始读取消息链表,第一个消息B无延时,直接返回给Looper;
4、Looper处理完这个消息再次调用next()方法,MessageQueue继续读取消息链表,第二个消息A还没到时间,计算一下剩余时间(假如还剩9秒)继续调用nativePollOnce()阻塞;
5、直到阻塞时间到或者下一次有Message进队;
3.2、Activity的生命周期,还有各场景下,各个生命周期的回调方法
参考链接:深入理解Activity的生命周期(https://www.jianshu.com/p/fb44584daee3)
核心知识点:
onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。
onResume:resume表示继续、重新开始,这名字和它的职责也相同。Activity在这个阶段已经出现在前台并且可见了。
onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。
onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。
这个阶段的主要工作也是做一些资源的回收工作。
3.2.1、在AActivity界面点击按钮后,跳转到BActivity界面,各个activity的生命周期回调顺序
答:(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop
3.2.2、在A界面点击按钮后,即startActivity(B)之后调了finish()方法,各个activity的生命周期回调顺序
答:(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop→(A)onDestory
3.2.3、在A界面,启动了一个透明的B界面,各个activity的生命周期回调顺序
答:(A)onPause→(B)onCreate→(B)onStart→(B)onResume
3.2.4、在A界面,启动了一个Dialog,activity的生命周期回调顺序
答:不会回调任何函数。
3.2.5、在A界面,启动了一个主题是Dialog的B界面,各个activity的生命周期回调顺序
答:(等测试)
4、算法题(占面试时间20%)
面试特点:链表相关算法必须顺便,大厂常考题目,可以刷leetcode里的题目,要自己动手写,别光看题目和解析,只有自己真正思考题目,模拟考试了,才知道自己的核心问题出在哪,怎么提升
4.1、两个双向链表,返回第一个相同节点
答:解题思路:
4.1.1、寻找返回结果的特性:
第一相同节点后的内容,两个链表后半段内容都一样
4.1.2、如果是基于多个数据的计算,先对齐数据关键特性:
这里的关键特性就是链表的长度,便于依次对比节点相等
解决方案就是:获取链表长度,先遍历长的链表,让两个链表长度对齐
4.1.3、遍历数据,指针概念:
这里使用双指针概念,一个指针遍历短的链表,另外一个指针遍历长的链表
参考答案:
public ListNodetest(ListNode listNode1, ListNode listNode2) {
if ((listNode1 ==null) || (listNode2 ==null)) {
return null;
}
int length1 = length(listNode1);
int length2 = length(listNode2);
ListNode shortListNode = length1 > length2 ? listNode2 : listNode1;
ListNode longListNode = length1 > length2 ? listNode1 : listNode2;
int offset = Math.abs(length1 - length2);
for (int i =0; i < offset; i++) {
if (longListNode ==null) {
return null;
}
longListNode = longListNode.next;
}
while ((longListNode !=null)
&& (shortListNode !=null)
&& (longListNode.next != shortListNode.next)) {
shortListNode = shortListNode.next;
longListNode = longListNode.next;
}
return longListNode;
}
private int length(ListNode listNode) {
ListNode temp = listNode;
int length =0;
while (temp !=null) {
length++;
temp = temp.next;
}
return length;
}
5、其他大厂有面试,但是字节面试官没有提到的内容
java虚拟机相关:内存模型,GC回收机制,同步处理volatile、synchronize
排序算法
线程池:彻底理解Java线程池原理篇
android其他相关的:ANR原理,AIDL原理
总结:
1、面试官人很好,可以有你来主导部分面试内容,需要准备好项目经验,突出项目难点,痛点;
2、准备好三方能力的原理,有深入了解过设计思想,实现方式,是加分项
3、算法题,可以事先和面试官沟通,解题思路,如果有重大漏洞,及时想第二种方案