android笔试题二

怀抱观古今,寝食展戏谑。这篇文章主要讲述android笔试题二相关的知识,希望能为你提供帮助。
1、android系统架构:
Linux内核——标准库——Framework层——应用层
Linux层包括:android系统的核心服务,硬件驱动,进程管理,系统安全等等
(现在又加了一层变成了:Linux内核——硬件抽象层——标准库——Framework层——应用层)
 
2、UI界面框架图:

android笔试题二

文章图片

3、View的测量模式:EXACTLY,AT_MOST,UNSPECIFIED。
4、自定义View与ViewGroup的时候应该注意什么?
自定义ViewGroup的时候应该注意重写onLayout来控制子类显示的位置。
如果需要支持wrap_content还要重写onMeasure()。
自定义View的时候,如果需要支持wrap_content,需要重写onMeasure().

5、自定义view的种类:
(1)、对已有的组件进行拓展
(2)、通过组合来实现新的控件
(3)、重写View来实现全新的控件
 
  6、实现滑动的方法:
(1)、通过layout方法。
(2)、通过LayoutParam来改变一个view的位置(必须有一个父布局才能够获取到组件的LayoutParam)。
(3)、scrollTo,scrollBy方法。(移动的是组件里面的内容,dx和dy如果是负数的话,那么内容往正方向移动,正数则往负方向移动)。
(4)、Scroller。
(5)、属性动画。
(6)、ViewDragHelper
(7)、offsetLeftAndRight()同时对左和右进行偏移。
【android笔试题二】                        offsetTopAndBottom()同时对上和下进行偏移。
7、独立像素dp与px的换算:
android系统使用mdpi即密度值为160的屏幕作为标准,在这个屏幕上,1px=1pd,各个分辨率直接的换算比例为:
ldpi:mdpi:hdpi:xhdip:xxhdpi=3:4:6:8:12
 
8、SurfaceView与View的区别:
(1)、View主要用于主动更新的情况,而SurfaceView主要用于被动更新的情况,例如频繁地刷新。
(2)、View是在主线程中进行刷新的,而SurfaceView是通过一个子线程来刷新页面的。
(3)、View在绘图的时候没有采用双缓冲机制,而SurfaceView在底层实现机制中就已经实现了双缓冲机制。
9、android的安全机制:
(1)、第一道防线:代码安全机制——代码混淆proguard。
(2)、第二道防线:应用接入权限控制——AndroidMainifest文件权限声明、权限检查机制。
(3)、第三道防线:应用签名机制——数字证书(Android系统不会安装没有签名的APP)。
(4)、第四道防线:Linux内核层安全机制——Uid访问权限控制
(5)、第五道防线:Android虚拟机沙箱机制——沙箱隔离
 
10、性能优化相关的工具:
(1)、Android  Link:有助于发现代码中隐藏的一些问题,比如布局嵌套太多等等。
(2)、Memory  monitor:这个是android  studio自带的内存监视工具,它可以很好地帮助我们进行内存实时分析。
(3)、TraceView:优化APP性能。
(4)、MAT工具分析APP内存状态。
 
11、Serializable与Parcelable的区别:
Serializable是java中的序列化接口,使用简单,但是开销大,序列化与反序列化过程需要大量的I/O操作。
Parcelable是android中的序列化方式,更加适用于Android平台上,不过使用起来稍微麻烦一点,但是效率高,这是android推荐的序列化方式,因此我们要首选Parcelable。
Parcelable主要用于内存序列化上,通过将对象序列化到存储设备中,或者讲对象序列化后通过网络传输也是可以的,不过过程比较复杂,因此这两种情况下将已使用Serializable。
 
12、多进程会造成什么问题:
(1)、静态成员与单例模式完全失效。
(2)、同步机制完全失效。
(3)、SharedPrefrences可靠性降低
(4)、Application多次创建
 
13、IPC的方式有哪些,区别是什么:
名称 优点 缺点 适用场景
Bundle 简单易用 只能够传输Bundle支持的数据 四大组件之间的进程间通讯
文件共享 简单易用 不适合高并发场景,并且无法做到进程间的即时通信 无并发访问情形,简单交换的数据实时性不高的场景
AIDL 功能强大,支持一对多并发通信 使用稍微复杂,需要处理好线程同步 一对多通信且有RPC需求
Messenger 功能一般,支持一对多串行通信
支持实时通信
不能很高的处理高并发情形,不支持RPC,数据通过
Messenger进行传输,因此只能够传输Bundle支持
的数据类型
低并发的一对多即时通信,无RPC需求,或者无需返
回结果的RPC需求
ContentProvider 在数据源访问方面功能强大,支持一对多
并发数据共享,可通过Call方法拓展其他
操作
可以理解为受约束的AIDL,主要是提供数据源的
CRUD操作
一对多的进程间数据共享
Socket 功能强大,可以通过网络传输字节流,支
持一对多并发实时通信
实现细节稍微有点繁琐,不支持直接的RPC 网络数据交换
14、线程的几种状态:
(1)、新建:新创建了一个线程对象。
(2)、就绪:线程对象创建后,其他线程(比如  main  线程)调用了该对象 的  start  ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取  cpu  的使用权  。
(3)、运行:可运行状态(  runnable  )的线程获得了  cpu  时间片(  timeslice  )  ,执行程序代码。
(4)、阻塞:
阻塞状态是指线程因为某种原因放弃了  cpu  使用权,也即让出了  cpu timeslice  ,暂时停止运行。直到线程进入可运行(  runnable  )状态,才有 机会再次获得  cpu timeslice  转到运行(  running  )状态。阻塞的情况分三种: (一).  等待阻塞:运行(  running  )的线程执行  o  .  wait  ()方法,  JVM  会把该线程放 入等待队列(  waitting queue  )中。 (二).  同步阻塞:运行(  running  )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则  JVM  会把该线程放入锁池(  lock pool  )中。 (三).  其他阻塞: 运行(  running  )的线程执行  Thread  .  sleep  (  long  ms  )或  t  .  join  ()方法,或者发出了  I  /  O  请求时,  JVM  会把该线程置为阻塞状态。                        当  sleep  ()状态超时、  join  ()等待线程终止或者超时、或者  I  /  O  处理完毕时,线程重新转入可运行(  runnable  )状态。(5)、死亡:线程  run  ()、  main  ()  方法执行结束,或者因异常退出了  run  ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

    推荐阅读