总结一下最近找工作一段时间的面试题及个人理解整理的答案,如果有问题请及时指正。
问的最多的是自定义View基本每家都问。
Q1、自定义View绘制的流程?
Q2、自定义View的步骤?
Q3、PhoneWindow实例是在哪个类哪个方法中实例化的?
Q4、Selector是怎么实现的?
Q5、View动画是怎么实现的,为什么移动后点击事件还在原来的位置?
A:回答这个问题首先需要知道Android在3.0之前,即API11,提供两种动画效果,一种是逐帧动画(Tweened Animation),另一种补间动画(Frame Animation)。
1、先说逐帧动画,只可作用具体View如TextView、Button,不可作用View的属性例如: 颜色、背景、长度宽度等。逐帧动画的原理就是将一组动画拆分成帧的形式,且每一帧对应一张图片,按照动画顺序播放一组预先定义好的图片。
逐帧动画的优点和缺点?
优点:使用简单、方便、适合较为复杂的个性化动画效果。
缺点:使用大量图片,比较浪费资源,切图不当分辨率较大的话,及容易引起oom(此处有坑,如果面试官继续问的话,可能就oom这个点问你,oom如何解决等一些文,需要有心理准备)。
2、补间动画,只可作用具体View如TextView、Button,不可作用View的属性例如: 颜色、背景、长度宽度等。补间动画的原理通过确定开始View样式和结束View样式,中间动画变化过程由系统补全,从而实现一组动画效果。结束View样式是指: 平移、旋转、缩放和透明度样式。补间动画分为四种动画:分别是平移动画、旋转动画、缩放动画、透明度动画。
3、属性动画,作用对象可以是任意的java对象,不再局限于view。可以自定义各种动画,不再局限于,平移、旋转、缩放、透明度这基本的4种。属性动画的原理在一段动画时间内,通过不断对对象属性值的变化,而实现该对象属性上的动画效果。
3、为什么移动后点击事件还在原来的位置?
补间动画只是改变view的视图效果,而不是去真正改变view属性。比如说:将屏幕左上角一个图片通过补间动画移动到屏幕右下角,补间动画只是将这个图片绘制到屏幕右下角,只是改变了视觉效果。
Q6、属性动画的原理机制?
Android系统源码部分。
Q1、View事件拦截和分发?
Q2、Android进程间通信的方式?
Q3、应用创建的启动流程?
Q4、Handler是怎么导致内存泄漏?
Q5、普通广播、有序广播、本地广播有什么区别?(这个问题回答的版本有很多种,但是面试官需要你理解广播发送与接收具体机制,如果只是知道如何使用是不够的,但到实际项目应用的时候,你会发现何时使用广播才是最重要的(扯得优点远了))
1、普通广播,是通过context.sendBroadCast()来发送广播,这种发送广播是异步的,这是因为你所有的广播接收者receiver接收广播的顺序都不固定,所以说普通广播效率较高。但是无法使用setResult系列api,将广播处理完的结果传递个下一个广播接收者,同时getResult系列api获取上一个广播处理结果,以及abortBroadCast()来终结广播的发送,直至再也没有匹配广播接收者为止。
2、有序广播,是通过context.sendOrderBroadCast()来发送广播,所有广播接收者receiver按照设定顺序来接收广播,这个设定顺序可以在mainfest清单中配置android:priority值范围0~9999值越大优先级越高,值相同则是看谁在清单先注册的优先。如果是在java中动态设置相同值的话,优先顺序不一定。可以使用setResult系列api来传递广播处理的结果,getResult系列api来接收上一个广播接收者处理的结果,可以通过abortBroadCast()来终止广播的传递。
3、本地广播,是通过LocalBroadCastManager.sendBroadCast()来发送广播,该广播只能在该app内部传播,其他app无法接收该广播。安全性、性能都比较高。
题外话,说一下你在项目中什么地方使用到了广播?也就是广播应用的场景?
一般分为三类:
1、动态的监听系统广播,比如说在BaseActivity中监听网络的变化,当网络变化是处理相关业务,再比如说视频播放器需要监听锁屏广播,当用户锁屏时onScreenStateChanged()屏幕关闭的话,关闭播放。当屏幕解锁时,接收到系统的锁屏广播,视频开始播放。
2、动态的注册自定义广播,比如说在IM实时聊天,需要通过设置AlarmManager定时发送PendingIntent注册一个意图广播,定时发送心跳包,以此来维持Socket长连接。
3、在mainfest清单中配置全局广播,比如说使用小米推送PingReceiver、PushMessageReceiver, 腾讯讯鸽XGPushBaseReceiver。
Q6、Activity生命周期相关问题?该类问题属于老生常谈了,但如果对于生命周期理解不到位的话或者没有理解面试官的提问的意图时,有可能要进坑。
Q、Activity在旋转屏幕时,生命周期是如何变化的?
1、如果说在mainfest清单中配置相关activity的属性android : onConfigChange属性的话,只会调用onConfigChange()函数。
2、如果说没有配置的话,那么需要将activity整个生命周期重新执行一遍。
具体顺序:onPause() - onSaveInstanceState() (如果你写了它,得注意它一定是在onStop之前调用,不一定在onPause之后调用)- onStop() - onDestory() - onCreate() - onStart() - onRestoreInstanceState() - onResume()
Q、接着问,onSaveInstanceState() 和 onRestoreInstance() 什么情况下不会被调用?
如果说通过代码调用activity.finish() 或者 按下back键,这两函数不会被调用。
Q、接着问,onSaveInstanceState() 它是在onStop() 函数之前调用还是在 onPause() 函数之后调用?
其中一定是在onStop()之前被调用,但不一定在onPause()之后调用。
Q7、(腾讯)通过HandlerThread和Handler+Thread的方式使用话,有什么区别?(这个问题主要考察对于Handler中)
第三源码库
Q1、Glide、OKHttp、Retrofit
项目架构、设计模式
Q1、MVC、MVP、MVVM 开发模式优缺点?
Q2、Android源码中用到设计模式有哪些(列举3)?
Q3、你常用设计模式有哪些,有什么特点?
其他
Q1、Binder机制原理?
Q2、AIDL有用过吗?
Q3、性能优化,如何检测一段代码的执行时间?
Q4、界面卡顿如何修复,滑动不流畅这么处理,50fps有什么办法提高到60fps?
Q5、如何检测内存泄漏?
Q6、leakcanay的原理?
Q7、线程和线程池?
Q8、wait()和sleep()区别?
Q9、同步锁 Q10、线程池参数得详解?
Q11、AsyncTask源码详解?
答案正在整理中.......
为什么我的文章不火呢?