Android 事件分发机制源码和实例解析

事件分发过程的理解 1.1. 概述 1.2. 主要方法 1.3. 核心行为 1.4. 特殊情况 案例分析 2.1. 案例1:均不消费 down 事件 2.2. 案例2:View0 消费 down 事件 2.3. 案例3:ViewGroup2nd 消费 down 事件 down 事件分发图 1. 事件分发过程的理解 1.1. 概述 事件主要有 down(MotionEvent.ACTION_DOWN),move(MotionEvent.ACTION_MOVE),up(MotionEvent.ACTION_UP)。 基本上的手势均由 down 事件为起点,up 事件为终点,中间可能会有一定数量的 move 事件。这三种事件是大部分手势动作的基础。 事件和相关信息(比如坐标)封装成 MotionEvent。 大体的分发过程为:首先传递到 Activity,然后传给了 Activity 依附的 Window,接着由 Window 传给视图的顶层 View 也就是 DecorView,最后由 DecorView 向整个 ViewTree 分发。分发还会有回溯的过程。最后还会回到 Activity 的调用中。 Activity 的分发事件源码 public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction(); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } 在 getWindow().superDispathTouchEvent 就是用来分发事件到 DecorView 中。如果整个 ViewTree 没有消费事件,会调用 Activity 的 onTouchEvent。 1.2.

Read more

Android API Guides 翻译:Bound Service

以下内容翻译自官方文档 http://developer.android.com/guide/components/bound-services.html#Creating 创建一个绑定的 Service 提供可绑定的 Service,需要先提供 IBinder 接口实例给客户端,用来作为和服务端的通信接口。一共有三种方式来定义通信接口 继承 Binder 类 如果 service 是应用私有的,并且和 client 运行在同一进程中,可以创建通过继承 Binder 类,在 onBind() 回调中返回实例,用来作为通信接口。client 检索 Binder ,直接使用 Binder 提供的公有方法,甚至直接调用 Service 的方法。 如果 service 只为该应用做后台工作,这是一样很好的技术。其他不适用该方式的场景在于,service 会被其他应用使用,或者运行在其他的进程中。 使用 Messenger 类 如果需要通信接口在不同的进程中工作,可以使用 Messenger 类来实现。在指南里,service 定义一个 Handler 来响应不同类型的 Message 对象。这个 Handler 是 Messenger 使用的,可以和 client 共享一个 IBinder,允许 client 使用 Message 来向 service 发送命令。另外,client 也可以定义一个 Messenger 用来获得 service 返回的 messages。 这是进行进程间通信(IPC)的简单方式,因为 Messenger 把所有的请求放入了同一个单例线程,所以不需要对 service 进行线程安全的设计。 使用 AIDL AIDL(Android Interface

Read more