Android 问题总结
1、事件分发机制
L1:
首先事件的分发是从上级一层层往下级传递,设定一个场景,Activity上有ViewGroup,而ViewGroup中有View,分发的过程分别是从Activity分发到ViewGroup再到View。
说到事件分发,涉及到3个方法,分别是dispatchTouchEvent interceptTouchEvent onTouchEvent,interceptTouchEvent 只有ViewGroup有,它负责拦截事件的传递,如果它决定拦截,那么消息不会向下传递。
L2:
了解事件分发机制,首先得知道事件作用在什么上,事件会作用Activity、ViewGroup、View,而它们三者拥有不同的事件分发机制:
Activity事件分发机制:
当一个点击事件发生时,最先到达的是Activity的dispatchTouchEvent。分析其源码:
if (event.getAction == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow.superDispatchTouchEvent()) {
return true;
}
return onTouchEvent(event);
在onTouchEvent中判断点击事件是否在window的边界外,如果在边界外,返回true,掉费掉事件,如果不在边界外,返回false。
ViewGroup:
事件从Activity传递过来,先调用dispatchTouchEvent,在其内部会判断是否进行拦截,如果拦截,自己来消费掉事件(onTouch、onTouchEvent、performClick、onClick),如果不拦截,则在其内部找到被点击的子控件,调用子控件的dispatchTouchEvent。
View:
事件从ViewGroup传递过来,先调用dispatchTouchEvent,在设置onTouch的情况下,并且enable为true,并且onTouch返回true时,将不会执行onTouchEvent,在上面任何条件不成立的情况下都会执行onTouchEvent。在onTouchEvent中,只要View可点击就一定会返回true,若控件不可点击就一定会返回false。
2、Handler 原理
L1:
首先Handler的作用是线程间通信,为什么要用Handler呢,因为在子线程中是不允许操作UI的,我们平常一般会将耗时操作放到子线程中,而当子线程执行完最后需要更新UI的时候,需要借助Handler通知主线程更新UI。
L2:
而说到Handler机制,涉及到三个概念,Handler、Looper、MessageQueue,handler将消息发送到消息队列,而Looper充当一个泵的角色,它以一个死循环的方式,一直在等待消息的到来,一有消息来的时候,它就进行一个统一的调度,然后将消息返还给handler处理,只有经过它的允许的消息才可以执行更新UI的操作。
3、Context
可以理解为场景,也就是用户与操作系统操作的过程,比如你打电话,场景包括电话程序对应的界面,以及隐藏在背后的数据。
在这里插入图片描述4、RecyclerView与ListView的对比
优点:
- 多:
- 它支持横纵向的线性布局、风格布局和瀑布流布局。
- 对item的添加和删除加入友好的动画效果。
- RecyclerView提供了局部刷新的API。
- 快:直接继承自ViewGroup来实现,这样可能会更高效。
- 省:复用item的工作由RecyclerView给做了,而不用再setTag和getTag了。
缺点:
- 不支持直接添加headerView和footerView
5、简述对Kotlin的认识
- 代码简洁,少了冗余代码的烦恼,更容易专注于功能的开发。
- 再也不用写findViewById了。
- 空安全使以后再也不用盯着空指针了。
- 弱类型变量使变量的定义更简单。
- 支持Lambds表达式。
6、广播和EventBus的对比
广播的优点:
- 同SDK的交互比较好,它可以直接获取Context和intent。
- 如果同Android交互的话,尽量选择广播,它有很好的便捷性
广播的缺点:
- 广播是比较消耗时间和空间的。
EventBus优点:
- 调度灵活,不依赖Context。
- 通知优化级,保证关注最重要的通知。
- 粘性事件能够保证,通知当时不在场也能接收到事件。
- 父类对于通知的监听和处理可以继承给子类,这样对于简化代码很有用
EventBus缺点:
- 只能应用内通信,而不能跨进程通信。
7、Activity 启动模式
standard
- 说明:默认启动模式,每次新启动一个 Activity 都新创建一个实例。
- 场景:默认场景
singleTop
- 说明:如果 AActivity 在 栈顶,再启动一次 AActivity 不会新创建实例,而是复用之前的实例,并调用 onNewIntent 方法。
- 场景:阅读类 App 的内容页面。
singleTask
- 说明:只要栈中有该 Activity 的实例,就不会创建新的,而是复用之前的。如果该 Activity 不在栈顶,会把在其上面的 Activity 都清除掉。
- 场景:浏览器的主页面或大部分 App 的主页面。
singleInstance
- 说明:具有全局唯一性,即整个系统中只有这一个实例。
- 场景:呼叫来电页面
8、2个 Activity 之间传递对象有哪向种方法,有什么区别
bundle.putSerializable
使用 I/O 读写存储在硬盘上,性能稍差,但代码简单。
bundle.putParcelable
直接在内存中读写,性能好,但需要写很多额外代码。
9、Activity、View、Window 之间的关系
每个 Activity 包含了一个 Window 对象,这个对象是由 PhoneWindow 做的实现。而 PhoneWindow 将 DecorView 作为了一个应用窗口的根 View,这个 DecorView 又把屏幕划分为了两个区域:一个是 TitleView,一个是 ContentView,而我们平时在 Xml 文件中写的布局正好是展示在 ContentView 中的。