前言
-
这里只是做些我认为可能被问到的面试题,难度中级开发吧。高级开发估计我也不会,毕竟一直在做应用层次的开发,虽然每次都想进行代码的优化,用户的体验的升级等等
-
总结面试提其实我觉得挺无奈的,很多情况下都是面试建航母,工作拧螺丝。现实如此,好像无解,只能坦然做好准备
开始吧
1、Activity的启动模式
标准模式(standard):每次都会新建Activity
单例模式(singleInstance):打开该Activity时,直接创建一个新的任务栈,并创建该Activity实例放入新栈中。
一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例
2、MVC,MVP,MVVM架构的区别
mvc: m代表model,网络请求 v代表xml c代表Activity,处理网络请求数据
mvp: m代表model,网络请求 v代表xml,Activity p作为mv之间的桥梁,同时处理复杂的逻辑
mvvm: m代表model,网络请求 v代表xml,Activity vm是ViewModel,主要用databinding技术,将控件和数据先结合
3、从A页面打开B页面,两个页面的生命周期
先A界面:onPause 然后B页面:onCreate onStart onResume 然后A界面:onStop
4、主线程的Looper死循环为什么不会导致ANR?
因为主线程的Looper实现的是可阻塞的死循环,当它有消息的时候处理消息,没消息的时候进入阻塞状态
5、Handler,Looper,MessageQueue的关系
Handler发信息到MessageQueue,Looper不断循环获取MessageQueue中的消息发给Handler处理
6、Handler通过sendMessageDelayed发送延时消息, 消息什么时候入队列
立刻就进入队列,只是会根据延迟时间,赋值给msg.when,队列根据msg.when整理链表,整理出时间从小到大的序列
7、默认线程池有多少种
有4种
newFixedThreadPool:只有核心线程
newSingleThreadExecutor:只有一个核心线程,不用处理线程同步问题
newCachedThreadPool:没有核心线程,都是非核心线程,无穷大,它可以根据程序的运行情况自动调整线程池的线程数量
ScheduledThreadPoolExecutor:定时定期线程池
8、做过哪些优化性能的工作
- 优化布局,减少布局层次,不必要的背景设置
- 在自定义控件中,onDraw尽量不新建局部对象,不做耗时任务
- 避免内存泄漏
- 如果有耗时操作,采用异步处理
9、如何对apk进行极限压缩
在Android studio中的outputs,双击apk,可以看到那些文件占多大
- 压缩图片
- 去除多语言
- 去除不必要so库,其实只需适配armeabi-v7a架构
- 开启混淆
- 移除无用资源shinkResource
10、HashMap的原理,hashCode的作用,重写equals为什么还要重写hashCode方法
HashMap原理:是数组和链表的组合体,数组的元素是链表,在jdk1.8中还加入了链表过大时链表转化为红黑树的设计,大大减少了查询时间
hashCode的作用:通过hash它的key确定数据放的数组的位置,如果该位置有数据了,就在形成的链表后面加入
重写equals为什么还要重写hashCode方法:因为要存放的位置,就相当于先找到桶,才能找到桶里面的东西
11、常见的内存泄漏原因和解决方案
- Static关键字修饰的成员变量
- 非静态内部类或者匿名类
- 资源对象使用后未关闭
12、说下动态代理和静态代理
编译时就确定了被代理的类是哪一个,是静态代理。
运行时才确定被代理的类是那个,是动态代理
网友评论