1.Android Touch事件InputManagerService源码解析(二)
2.Android Jetpack 架构日记- LiveData 事件发送原理解析
3.Android事件分发机制
4.Android开发——HOOK技术解析
Android Touch事件InputManagerService源码解析(二)
解析Android Touch事件分发过程,事事件深入InputManagerService源码。码分触摸事件的发机分产生与传递机制是本文探讨的核心。
InputDispatcher接收到事件,处理通过enqueueInboundEventLocked接口将事件放入mInboundQueue队列,事事件等待分发处理。码分易语言qq飞车源码
InputDispatcher内部线程在有事件时被唤醒,发机分执行dispatchOnce,处理根据事件类型调用dispatchMotionLocked进行处理。事事件处理流程涉及找到要处理事件的码分窗口。
窗口查找通过findFocusedWindowTargetsLocked方法实现,发机分该方法从map中获取focusedWindowHandle和focusedApplicationHandle,处理存储目标窗口信息。事事件
这些句柄的码分初始化在Activity的生命周期回调中,如Activity.onResume时。发机分具体路径涉及ActivityTaskManagerService、DisplayContent、InputMonitor和InputManagerService。
分发循环由prepareDispatchCycleLocked、enqueueDispatchEntryLocked和enqueueDispatchEntriesLocked方法实现,通讯源码查询最后调用startDispatchCycleLocked,将事件发送给对应进程。
InputReader持续从底层读取事件,InputDispatcher通过线程处理分发,直至事件被发送至目标进程。本文深入解析了Touch事件的分发机制与关键步骤,提供了对Android触摸事件处理过程的全面理解。
Android Jetpack 架构日记- LiveData 事件发送原理解析
Android Jetpack架构中的LiveData并不像EventBus那样存在粘性事件或数据倒灌的“bug”。接下来,我们通过分析其工作原理来揭示这一误解。
粘性事件在LiveData中的理解不同于EventBus。EventBus的粘性事件是为了确保在页面切换时,新页面可以接收到之前发送的事件。相比之下,LiveData所谓的“粘性事件”是指在观察者订阅后,会接收到之前已发送的值,即使这些值在订阅前已存在。
让我们通过日志观察来探究:为何在LiveData中,观察者在onStart方法中耗时的面试源码解读睡眠会影响事件的发送?以及为何onResume调用在预期之前。实际上,观察者在订阅时被Activity生命周期管理,且在onStart后才开始激活并尝试分发值,这解释了延迟现象。
在Activity的Lifecycle 版本中,分发逻辑有所变化,这影响了观察者回调的时机。当Activity处于CREATED阶段时,分发不会立即发生,直到onStart方法执行完毕后,状态变为STARTED,才会开始分发值。这就解释了数据可能看起来“倒灌”的现象。
在BActivity中,点击按钮重新订阅时,如果先执行的是主线程的postValue,观察者状态为INITIALIZED,会导致旧值先被分发。但当主线程执行完成,退款链接源码新的订阅才会接收到最新的值。
虽然Lifecycle在某些场景下可能表现出类似粘性事件的行为,但它并非真正的粘性事件,而是遵循特定的生命周期规则。因此,理解LiveData的工作机制是关键,而非将其归咎于“粘性事件”或“数据倒灌”。
Android事件分发机制
在Android的事件分发机制中,从触摸屏幕开始,一系列事件沿着从Activity到decorview直至最内层view的路径传递。每层view或viewgroup首先调用其dispatchTouchEvent方法,判断是否在当前层消费事件。
首先,查看伪代码,展示事件分发过程。若当前为viewgroup层级,会检查onInterceptTouchEvent是否为true。若是,则事件在当前层级消费,escar源码介绍不再传递至下一层。反之,事件继续传递至下层的dispatchTouchEvent方法,直至最内层view。在最内层view,可选择拒绝消费事件,若返回false,则事件传递至上一级容器直至Activity。
事件的调用关系涉及onTouch、onTouchEvent和onClick。当某层view的onInterceptTouchEvent被调用,表示该层级消费事件。若有onTouchListener设置,则onTouch被调用。返回true,则onTouchEvent不会执行。相反,返回false或无onTouchListener,则调用onTouchEvent。而onClick方法在设置onClickListener后,正常执行。
流程图总结了事件分发过程。接下来,深入解析源码。触摸事件首先到达Activity,然后传递给根view,最终至最内层view。在Activity层级,查看onUserInteraction方法为空,调用getWindow().superDispatchTouchEvent(ev),返回true或false决定事件消费与否。接着,进入PhoneWindow和DecorView,最终到达viewgroup的dispatchTouchEvent方法。
在viewgroup(dispatchTouchEvent)层,关键代码截取,条件之一为ACTION_DOWN事件,另一个条件由mFirstTouchTarget字段决定,若非ACTION_DOWN事件或当前viewgroup消费事件,则执行onInterceptTouchEvent方法。若事件被拦截,后续事件将由当前viewgroup处理,不执行onInterceptTouchEvent。通过disallowIntercept字段检查是否允许拦截。
若viewgroup不拦截事件,事件将传递给子view。此过程在dispatchTouchEvent方法中完成,条件检查确保事件传递给适当子view。子view的处理在dispatchTransformedTouchEvent方法中执行,若满足条件则调用child.dispatchTouchEvent(event)。
在view层级,首先检查是否有onTouchListener,若有则执行onTouch方法。返回false则不执行onTouchEvent。若无onTouchListener,则执行onTouchEvent。在onTouchEvent中,若view设置为点击可触发事件,则执行performClickInternal和performClick方法触发点击。
源码分析揭示了事件分发机制的细节。事件分发机制在实际应用中用于解决滑动冲突问题,通过外部或内部拦截实现。了解此机制对优化用户体验和解决技术问题至关重要。
事件分发机制应用示例包括解决滑动冲突,通过外部或内部拦截方法实现。了解事件分发机制有助于解决实际问题,优化应用性能。
Android开发——HOOK技术解析
Android 开发中,Hook 技术犹如一个灵活的「钩子」,能够在事件传递的流程中插入自定义处理。系统通过事件分发机制运作,而 Hook 则能监控并影响这个流程。API Hook 技术允许我们改变 API 的执行路径,尽管Android的沙箱机制限制了直接修改其他程序,但Hook技术为我们提供了解决方案。Hook的应用广泛,开发者可以用来记录执行日志,防止重复启动,而恶意者则可能利用它拦截用户输入获取敏感信息。
实战中,假设我们需要在不改动现有点击事件的前提下,为某个 View 添加额外逻辑。首先,确定要 Hook 的对象,如View的OnClickListener。通过追踪源码,发现OnClickListener被ListenerInfo持有。接下来,创建一个代理类,实现OnClickListener接口,确保保留原有逻辑。然后,使用反射将代理对象替换掉原始的ListenerInfo,实现 Hook 目标。具体代码中,代理类的使用展示了 Hook 的过程。
Android Hook技术的实现方式主要有两种,它在调试和优化应用时扮演了重要角色。深入理解 Hook,可以参考《Android核心技术手册》等权威资料。通过 Hook,开发者可以巧妙地调整应用行为,但同时也需注意潜在的安全风险。