2017安卓面试问题总结

Android基础

一、触摸事件的分发
1. 触摸事件的处理涉及三个方法:dispatchTouchEvent()、onInterceptEvent()、onTouchEvent()
2. 从Activity的dispatch开始传递,如果没有拦截,则一直传递到子view。
3. 如果子View没有消费事件,事件会向上传递,这时父Group才可以消费事件。
4. 如果子View没有消费DOWN事件(没有返回 true),后续事件都不会再传递进来,直到下一次DOWN。
5. OnTouchListener的处理优先级高于onTouchEvent()

二、Handler.postDelay()的原理
1.  Handler.postDelayed()精确延迟指定时间的原理

三、Fragment的生命周期

3.JPG

四、Gson的原理
1. 如果使用默认的new Gson()对象,则采用反射来进行json的解析。
2. 如果使用GsonBuilder来创建,并使用自定义的TypeAdapter,则会用自定义的TypeAdapter来解析json字符串。

五、Serializable和Parcelable的区别
1. S是Java的序列化方案,P是Android的
2. S在序列化的时候会产生大量的临时变量,导致频繁GC,P则不会。因此在内存中使用时(如网络中传递或进程间传递)推荐使用P。
3. P被设计为IPC通信数据序列化方案,不适用于保存在磁盘上,此时应用S。
4. S只需要继承Serializable接口即可,P则需要重写writeToParcel方法、重写describeContents方法、实例化Parcelable.Creator。

六、一个Activity启动另外一个Activity并返回的生命周期调用
1. A.onCreate()
2. A.onStart()
3. A.onResume()
4. 启动B
5. A.onPause()
6. B.onCreate()
7. B.onStart()
8. B.onResume()
9. A.onStop()
10. 返回A
11. B.onPause()
12. A.onRestart()
13. A.onStart()
14. A.onResume()
15. B.onStop()
16. B.onDestory()

七、startService和bindService的区别
1. startService启动的Service在调用者自己退出而没有调用stopService时会继续在后台运行。
2. bindService启动的Service生命周期会和调用者绑定,调用者退出时Service也会调用unBind()->onDestory()退出。
3. 先调用startService再调用bindService时Service也只会走一遍生命周期。
4. 除了startService和bindService,Service的生命周期只有三个方法:onCreate()、onStart()、onDestoty()。

八、如何监听ListView的item被回收了?
1. AbsListView.setRecyclerListener()
2. #onMovedToScrapHeap(View view)
3. RecyclerView.setRecyclerListener()
4. #onViewRecycled(ViewHolder holder)

九、什么是属性动画
1. Android在3.0引入属性动画的原因是视图动画有两个无法克服的缺点:只能对View进行操作,只支持移动、缩放、旋转和淡入淡出。
2. 属性动画不针对View来设计,实际上是一种不断地对值进行操作的机制。
3. ValueAnimator是针对值来进行变更的动画,值可以是int或float或任意对象。如果是对象的话需要实现TypeEvaluator,int和float是可选的。
4. ObjectAnimator继承ValueAnimator,可以对任意对象的任意属性执行变更动画,前提是属性有get和set方法。

十、Android系统是如何保证一个线程只有一个Looper的
1. Looper.prepare()使用了ThreadLocal来保证一个线程只有一个Looper。
2. ThreadLocal是Java1.5中提供的多线程保持对象的方法和避免参数传递路径过长的解决方案(注意它并不是被设计用于多线程通信或同步的)

十一、如何定义一个Gradle Task
1. 定义Task类型:class HelloWorldTask extends DefaultTask{}
2. @TaskAction用来标记这个task被执行时调用的方法:@TaskAction def hello {println "Hello World"}
3. @Optional用来标记可选变量:@Optional String message = "m";
4. 定义Task时即可指定Task类型,同时也可定义可选变量(如果有的话):
5. task hello(type: HelloWorldTask)
6. task hello(type: HelloWorldTask){message = "message"}

十二、ListView的ViewType的限制
1. 只能是数字
2. 取值[0, getViewTypeCount() - 1]
3. 见android.widget.Adapter类的getItemViewType()方法的注释

十三、什么是ViewStub
1. ViewStub是一个轻量级的View,用于延迟加载布局和视图
2. 它不可见时不占布局位置、所占资源非常少。当可见时或调用ViewStub.inflate时它所指向的布局才会初始化
3. ViewStub只能被inflate一次
4. ViewStub只能用来inflate一个布局,不能inflate一个具体的View

十四、SurfaceView的特点
1. SurfaceView拥有独立的绘图表面,即它的UI可以在独立线程中绘制
2. Android系统的UI由SurfaceFlinger服务负责绘制,每一个窗口有一个Layer用于描述它的绘图表面,所以可以实现独立于主线程进行绘制

十五、如何调试ANR
1. DDMS输出的LOG可以判断ANR发生在哪个类,但无法确定在类中哪个位置
2. 在/data/anr/traces.txt文件中保存了ANR发生时的代码调用栈,可以跟踪到发生ANR的所有代码段
3. adb pull 来pull traces文件到电脑上

十六、Android程序方法数上限65535是怎么来的?
1. 方法数超限后的错误发生在构建期
2. Dex的文件定义中方法数的索引长度为32位(2^32=65536×65536),所以不是Dex文件格式的限制
3. Dalvik虚拟机的指令集中,B类查询参数(@BBBB)的长度为16位,所以支持的最大方法数是65535
4. 不仅包括方法数,还包括field数和class数,所以dx(class转dex的)工具会对其进行检查,超限就会报错
5. ART虚拟机在安装应用时会自动将多个dex文件编译成一个.ota文件用于执行,所以理论上不存在方法数超限的问题
6. 但是由于目前apk标准中仍然使用.dex作为可执行文件的格式,为保证向下兼容Dalvik,dx工具在构建时仍然会对方法数进行检查,与实际运行环境是Dalvik还是ART无关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值