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

posted @ 2024-07-14 11:03  云云星羽  阅读(20)  评论(0)    收藏  举报