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失败