今天需要研究 WindowManagerService 如何把Event. 丢给当前的Activity.
ViewRoot这个类在android的UI结构中扮演的是一个中间者的角色,连接的是PhoneWindow跟WindowManagerService.在每个PhoneWindow创建的时候,系统都会向WindowManger中的一个保存View数组增加PhoneWindow的DecorView对象,WindowManger在保存好这个View对象的同时,也会新创建一个ViewRoot对象用来沟通WindowManagerService。可以查看WindowManagerImpl跟 ViewRoot中的代码,臧春杰同时ViewRoot中我们可以看到一个W类型,该类型派生自IWindow.stubIwindowSession则是WindowManagerService中的远程调用接口,创建了一个PhoneWindow,也就创建了一个ViewRoot,并将在 WindowManagerService注册。接下来简单的看下KeyEvent的传递。qisda changer在WindowManagerService中
focus.mClient.dispatchKey(event);
这个段代码的mClient则就是ViewRoot中的W类型,通过远程调用,可以看看ViewRoot的处理:
boolean handled = mView != null? mView.dispatchKeyEventPreIme
接下来就到了mDecor里,也就是整个View树的根。然后比较臧春杰代码坐标判断是哪个View. 如果不在任何View范围里,就把消息给PhoneWindow.因为实现了Activity的CallBack 在Window不处理时候给Activity.
哎,还是非常模糊,好多东西不细致,理解不透彻。怎么办呢?
Handler.java
都知道Handler主要用来做线程间通信,为什么要用线程间通信? 如何进行通信?
Uithread要做定时更新,需要另外一个线程提供定时然后通知ui。
如何通信。用handle sendMessage postMessage等。 需要理轻 Handler 和那个线程绑定的。 如何判别?
一个线程有个Looper管理一个MessageQueu Uithread已经实现了这个Looper . 也有个这个队列。
Looper.getMainLooper返回了UI臧春杰代码线程的Looper。 New Handler(这个UILooper) 那么这个Hander就和UI绑定了。
如果 要自己创建线程。实现消息队列。 Looper.prepare 创建消息队列。 Looper.loop开始循环。
然后创建handler(Looper.myLooper) 实现帮定。
Handler和谁绑定有looper决定。
Uithread已经有Looper,可以直接使用。创建空的handler就是绑定主线程。
我们自己的线程需通过prepare loop 创建消息队列。
分享到:
相关推荐
通过理解ViewRoot的工作机制及其与其他组件之间的交互,开发者能够更好地优化应用程序的性能和用户体验。对于希望深入了解Android底层机制的开发人员来说,研究ViewRoot的实现细节是非常有价值的。
8.6.2 ViewRoot的你问我答 / 384 8.6.3 LayerBuffer分析 / 385 8.7 本章小结 / 394 第9章 深入理解Vold和Rild / 395 9.1 概述 / 396 9.2 Vold的原理与机制分析 / 396 9.2.1 Netlink和Uevent介绍 / 397 9.2.2 初识...
邓凡平,资深Android开发工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有非常深刻的认识和理解,应用开发经验也十分丰富。目前就职于国内一家领先的 Android企业,负责Framework的开发和...
8.6.2 ViewRoot的你问我答 8.6.3 LayerBuffer分析 8.7 本章小结 第9章 深入理解Vold和Rild 9.1 概述 9.2 Vold的原理与机制分析 9.2.1 Netlink和Uevent介绍 9.2.2 初识Vold 9.2.3 NetlinkManager模块分析 9.2.4 ...
如果在非UI线程中尝试修改UI元素,会抛出`android.view.ViewRoot$CalledFromWrongThreadException`异常。 为了确保用户界面的响应性,避免主线程被长时间阻塞,耗时的操作如网络请求、数据库操作等应当在其他线程中...
4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 ...
在Android系统中,事件处理和多线程的运用是至关重要的。...理解和掌握这些机制对于开发高质量的Android应用至关重要。开发者需要根据具体需求选择合适的事件处理方式,并合理运用多线程,以优化性能和提高用户体验。
4.1 初识View Root和Decor View / 174 4.2 理解Measure Spec / 177 4.2.1 Measure Spec / 177 4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 ...
理解和掌握这些知识,可以帮助开发者更顺利地进行Android应用的开发工作。在遇到类似问题时,首先检查错误信息,然后根据提示进行相应的修复,大多数情况下都能解决问题。同时,不断学习和实践也是避免和解决这类...
综上所述,理解和掌握Android中的进程与线程的概念及其实现机制对于开发高性能、稳定的Android应用至关重要。无论是主线程的管理、MessageQueue的使用还是Handler和AsyncTask的应用,都需要开发者深入理解才能灵活...
在消息分发方面,`ViewRoot`调用`RootHandler().dispatch()`方法,进一步调用`dispatchKey`。如果存在输入法,`KeyEvent`会被转发给输入法服务;否则,事件将通过`deliverKeyEventToViewHierarchy`方法传递给视图...
ViewRoot是一个Handler,作为View与WindowManager通信的中介。动画的绘制过程涉及递归地绘制整个窗口,包括绘制背景、可能的层保存、View内容的绘制以及子View的递归绘制。 在Android中,动画主要分为两种类型:帧...
/ 154 3.5.1 常见的滑动冲突场景 / 155 3.5.2 滑动冲突的处理规则 / 156 3.5.3 滑动冲突的解决方式 / 157 第4章 View的工作原理 / 174 4.1 初识View Root和Decor View / 174 4.2 理解Measure Spec / ...
- **View Root**:是与Window Manager交互的Handler,当一个DecorView被加入WMS时,会创建ViewRoot作为交互的桥梁。 - **事件分发(Event Dispatch)**:触屏事件的分发遵循特定的规则,涉及measure、layout和draw三个...
- Window包含一个ViewRoot,由Layout、LayoutInflater和addView管理。 - WindowManagerService接收窗口管理的消息,回调Activity的相关函数,如onKeyDown等。 5. **Context的介绍**: - Context是Android中的...
综上所述,"Android模拟点击"涵盖了Android权限管理、服务、定时任务、坐标计算、多线程、安全隐私等多个技术领域,对于开发者来说,理解和掌握这些知识点是实现高效且安全的模拟点击功能的关键。
在Android开发中,有时我们需要根据特定需求动态地创建和管理UI元素,比如在用户交互时按需生成按钮、文本输入框等控件。这个过程涉及到Android的布局管理、控件的实例化、事件监听以及视图层次结构的构建。下面我们...
以上只是初级Android面试中的一部分常见知识点,深入理解和熟练掌握这些概念对于开发者来说至关重要。在实际面试中,可能会有更多关于性能优化、网络请求、UI设计模式等方面的问题出现。因此,持续学习和实践是提升...
在Android开发中,用户交互是应用的核心部分,而长按事件(Long ...记住,良好的注释能够帮助我们更好地理解和维护代码。在实际开发中,根据需求,你还可以自定义更复杂的长按行为,比如启动新的Activity、显示菜单等。