怀抱观古今,寝食展戏谑。这篇文章主要讲述android笔试题二相关的知识,希望能为你提供帮助。
1、android系统架构:
Linux内核——标准库——Framework层——应用层
Linux层包括:android系统的核心服务,硬件驱动,进程管理,系统安全等等
(现在又加了一层变成了:Linux内核——硬件抽象层——标准库——Framework层——应用层)
2、UI界面框架图:
文章图片
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 | 网络数据交换 |
(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 ()方法,则该线程结束生命周期。死亡的线程不可再次复生。
推荐阅读
- APP性能测试 -----GT软件使用
- 《基于Android的读书笔记api》
- APPScan安装与使用教程
- Appium-appium日志分析
- call()和 apply()的作用和区别
- Android wifi无线调试App新玩法ADB WIFI
- 如何实现在H5里调起高德地图APP
- About App Sandbox
- android studio导入工程时遇到的问题