android 面试
android 面试
Android事件分发机制:
事件首先到达activity的dispacterOnTouchEvent,由它分发
首先分发给viewgroup的dispacterOnTouchEvent,返回true则消费,返回false则回到activity中
调用super则传递给onInterceptTouchEvent,返回true则交给ontouchevent,返回false或者super则交给
view的dispacterOnTouchEvent,返回false 则回到上一层,返回true则消费,super则调用view的ontouchevent
ontouchevent中如果返回true则消费,返回false或者spuer则回到上一层
widthMeasureSpec和heightMeasureSpec,这两个参数包含了父View对当前View的测量要求。这些要求由大小和模式组成。可以通过以下方法来获取测量模式和大小:
获取宽高 的测量模式和大小,通过高低位记录,测量模式有指定值,确切值和最大值。
自定义view为什么要一定要实现一个构造函数
1 要在应用中绘制view需要他的context
2 要从attributeSet中获取设置的各种属性
3 应用设置的style
xml文件是怎么转化成view对象的
读取xml文件,使用解析器解析各个节点构成数据结构,转换为view对象,将属性应用于view对象上,返回根view(viewgroup)
Handler的机制
是一个队列,主线程中创建handler,子线程中持有handler,发送到队列中,
队列中循环得到消息,通过dispatchMessage发送给handler,handler中进行回调。
通过postAtFrontOfQueue或者postDelayed将消息插入队头。
ActivityThread 默认创建了主线程的Lopper
Handler.Callback 有优先处理消息的权利 ,当一条消息被 Callback 处理并拦截(返回 true),那么 Handler 的 handleMessage(msg) 方法就不会被调用了;如果 Callback 处理了消息,但是并没有拦截,那么就意味着一个消息可以同时被 Callback 以及 Handler 处理。
HandlerThread
持有handler的子线程。子线程中通过Loop.prepare的创建lopper,通过mylopper得到lopper,Looper.loop 开始循环处理消息
动画
view动画,PropertyAnimation动画,间补动画和属性动画
属性动画:
插值器:根据时间流逝的百分比计算属性变化的百分比
估值器:在插值器的基础上由估值其算出属性变化了多少
利用这俩计算各个时刻view的属性,通过改变属性来实现动画
view动画:只是影像变化,view还在原来的地方
帧动画:在xml中定义一系列图片之后用AnimatonDrawable播放
属性动画才是真正移动了view
Context
applicationContext和ActivityContext的区别
applicationContext的生命周期是整个application,activitycontext的声明周期则跟随activity。
Activity继承自ContextThemeWraper,其他的继承自ContextWrapper
任何一个Context的实例,只要调用getApplicationContext()方法都可以拿到我们的Application对象。
创建对话框时不可以用Application的context,只能用Activity的context。
view绘制流程
测量 布局 绘制
viewrootimpl 连接Windowsmanager和decorview的纽带
测量布局绘制均是通过viewrootimpl开始的
measure决定了view的宽高,
layout过程决定view怎么摆放
draw调用过程:顶层的view的draw在viewrootimpl中调用,通过dispatchdraw实现 ondraw用来绘制自身
面向对象的基本原则
SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)
自定义View为何需要重写onMeasure方法
直接继承View的自定义控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content相当于使用match_parent
类加载
加载-》连接-》初始化
类加载器的主要作用就是加载 Java 类的字节码到JVM中
动态加载
sharedPreferences 优缺点
优点:简单易用,轻量,持久化,多线程
缺点:数据类型有限,容量有限,存储过大的内容读取会变慢,私有的不能共享
共享viewmodel 的数据倒灌问题
新加入的监听者得到老的数据
解决:
SingleLiveData 源码分析 版本号控制,每次访问都返回最新版本的数据
数据倒灌的解决方式
将观察者独立出来,界面没有销毁就不需要去重新建立观察者
RxJava 订阅发布模型
相关:订阅者,发布者,背压,Flow
Window和Activity的关系
一个Activity中至少存在一个window与之绑定。并由window处理用户事件和系统事件
phonewindow
window的唯一实现是phonewindow,其依赖于activity,承载decorview
handler引起的内存泄漏
handler持有activity looper持有handler activity生命周期结束后 looper仍然持有handler 内存泄漏
framework
init进程 =》 zygote进程 =》SystemServer进程 =》 AMS PMS WMS
linux根进程 android根进程
锁
悲观锁在每次操作时都上锁,其他线程想访问会被阻塞。
乐观锁不会每次都上锁,只在提交时 检查资源是否被其他线程修改
版本号,CAS(V当前值,E预期值,N目标值)检查当前值是否是预期值,若是则更新为目标值,不是则放弃,CAS失败

浙公网安备 33010602011771号