dispatchTouchEvent,onUserInteraction,onTouchEvent 调用时序

理解Android触摸与键盘事件处理流程

  • 一、只有一个Activity时:一次拇指点击事件(包括ACTION_DOWN,ACTION_UP),调用时序如下:

  1. dispatchTouchEvent

  2. onUserInteraction

  3. onTouchEvent (ACTION_DOWN)

  4. dispatchTouchEvent 

  5. onTouchEvent (ACTION_UP,不会触发onUserInteraction)

 

  •  二、只有一个Activity,当键盘键按下时,时序如下

  1. dispatchKeyEvent

  2. onUserInteraction

  3. onKeyDown

  4. dispatchKeyEvent

  5. onUserInteraction

  6. onKeyUp (注意与触摸不同,当松开按键时onUserInteraction也会触发。)

  • 三、Activity里有一个Layout,在Layout里有个按钮。一次拇指触摸点击事件(包括ACTION_DOWN,ACTION_UP),方法逻辑顺序如下:

  1. Activity的dispatchTouchEvent

  2. Activity的onUserInteraction

  3. Layout的dispatchTouchEvent

  4. Layout的onInterceptTouchEvent

  5. Button的onTouchEvent(ACTION_DOWN)

紧跟着是一个ACTION_UP事件

  1. Activity的dispatchTouchEvent(不触发Activity的onUserInteraction,它对ACTION_UP不起作用。)

  2. Layout的dispatchTouchEvent

  3. Layout的onInterceptTouchEvent

  4. Button的onTouchEvent

  5. Button的onClick

如果在onTouchEvent里返回true,消费了该事件,那么onClick将不会被响应。

但是如果不写onClick事件,而onTouchEvent事件返回false,也没有上述时序中的最后一步,其他时序即事件不会再向上传递,估计是onClick有默认响应不处理,而onClick不会有返回值。但是如果是继承了一个View而且又覆写了onTouchEvent,若返回false,那么触控会向上传递。

时序如下

  1. Activity的dispatchTouchEvent

  2. Activity的onUserInteraction

  3. Layout的dispatchTouchEvent

  4. Layout的onInterceptTouchEvent

  5. Button的onTouchEvent (ACTION_DOWN)

  6. Layout的onTouchEvent (ACTION_DOWN)

紧跟着是一个ACTION_UP事件

  1. Activity的dispatchTouchEvent(不触发Activity的onUserInteraction,它对ACTION_UP不起作用。)

  2. Layout的dispatchTouchEvent

  3. Layout的onInterceptTouchEvent

  4. Button的onTouchEvent

onClick事件不再发生。

  •  对于键盘监听

VIEW和Activity本身都有相应键盘事件的ONKEYUP和ONKEYDOWN

对于VIEW,可以setOnKeyListener监听键盘事件,如果既对VIEW写了上述侦听,又覆写了ONKEYUP,DOWN事件,那么首先进入ONKEYDOWN,UP。

 

REFERENCES:http://lexhsu.lofter.com/post/3f493_1f3348

http://blog.youkuaiyun.com/wangtao4226/article/details/6868587

http://blog.youkuaiyun.com/ritterliu/article/details/7610486

 

http://www.cnblogs.com/jqyp/archive/2012/04/25/2469758.html


---------------------------------------------------------------------------------------------------------------------------------
copyright:http://www.cnblogs.com/anee/


------------------------------------------------------------------------------------======================================



A. 可以尝试修改Activity源码来实现:
1)onResume 中判断当前activity是否是launcher(具有MAIN、HOME属性)
2)1条件成立的话启动一个计时器,不成立退出之前的计时器(如果存在)
3)计时器30秒没有按键、触摸事件后启动自己的activity,然后退出计时器
4)如果30秒内有按键、触摸事件,则重新计时

B.service中实时监听当前activity
与A差不多,但是需要1s判读一下当前运行的activy是否为launcher
好处是不需要修改源码,缺点当然是实时判断耗费资源,非可取的设计模式。

如果需要防止休眠,还需要获取一下电源锁

onUserInteraction*



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值