Android 事件处理模型(一)回调机制

最近在看Android的事件处理模型,将从四个方面进行总结:

1. 基于回调机制的事件处理

2. 基于接口监听的事件处理

3. Handler 消息传递

4. AsyncQueryHandler 消息传递



本次主要总结Android的基于回调机制的事件处理


在Java中回调就是一个类A中的一个方法am1调用另外一个类B中的方法bm1最后经过一系列调用后,B中的方法调用了

A中的方法am2。关于回调网上有个很好的比方,我在这里引用一下:

我有一道很难的编程题解不出来,于是发邮件给张胖同学,于是我就去打游戏去了,等了XXX时间后,张胖同学发邮件给我说问题解决了。

在这个过程中,张胖同学要通知我所以他必须有我的email地址,这就是注册回调函数,表现为new CallBack()...,并把它传给控制类。 

解题就是回调函数,而我就是事件的控制者。我的email必须有效,网络良好,这样才能收到他的回信,这指的就是接口规范,不然答案就可能发给别人了,

比如在Android的onKeyDown事件中,你要得是返回键的键值,传来的是menu键值,那你就什么都得不到了。

当然如果你某天发现张胖同学的解题很慢让你很不爽,于是你就不去问张胖同学而选择用google了,这是只需重写回调函数就行了。

所以回调目的就是为了消息的传递以及功能的自定义,还是说onKeyDown()这个事件,在Android中所有的View都实现了

这个回调方法,而你可以通过重载onKeyDown()方法来实现对该事件的自定义。


简略的分析下Android中事件处理中的 回调机制的代码:(针对键盘事件的onKeyDown)


1. 首先是KeyEvent的Callback接口,它定义了key事件的基本操作(onKeyDown,onKeyLongPress,onKeyUp,onKeyMultiple)

这也是基本的回调函数,就是供我们重载而自定义的部分

[java]  view plain copy
  1. public class KeyEvent extends InputEvent implements Parcelable {  
  2.   
  3.     public interface Callback {  
  4.   
  5.         boolean onKeyDown(int keyCode, KeyEvent event);  
  6.   
  7.         boolean onKeyLongPress(int keyCode, KeyEvent event);  
  8.   
  9.         boolean onKeyUp(int keyCode, KeyEvent event);  
  10.   
  11.         boolean onKeyMultiple(int keyCode, int count, KeyEvent event);  
  12.     }  
  13.   
  14. }  


2. 然后是View 类它实现了KeyEvent的Callback接口,也就是回调函数

[java]  view plain copy
  1. public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {  
  2.      ..........  
  3.      public boolean onKeyDown(int keyCode, KeyEvent event) {  
  4.         boolean result = false;  
  5.   
  6.         switch (keyCode) {  
  7.             case KeyEvent.KEYCODE_DPAD_CENTER:  
  8.             case KeyEvent.KEYCODE_ENTER: {  
  9.                 if ((mViewFlags & ENABLED_MASK) == DISABLED) {  
  10.                     return true;  
  11.                 }  
  12.                 // Long clickable items don't necessarily have to be clickable  
  13.                 if (((mViewFlags & CLICKABLE) == CLICKABLE ||  
  14.                         (mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) &&  
  15.                         (event.getRepeatCount() == 0)) {  
  16.                     setPressed(true);  
  17.                     if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {  
  18.                         postCheckForLongClick(0);  
  19.                     }  
  20.                     return true;  
  21.                 }  
  22.                 break;  
  23.             }  
  24.         }  
  25.         return result;  
  26.     }  
  27.     ..........  
  28. }  


3. 最后是其他的组件如TextView,Button等,它们通过继承View,重载onKeyDown方法而能自定该事件动作。

[java]  view plain copy
  1. public class TextView extends View implements ... {  
[java]  view plain copy
  1. ....................  
  2. @Override  
  3. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  4.     int which = doKeyDown(keyCode, event, null);  
  5.     if (which == 0) {  
  6.         // Go through default dispatching.  
  7.         return super.onKeyDown(keyCode, event);  
  8.     }  
  9.     return true;  
  10. }  
  11. ....................  


那回调是怎么发生的哪?

在你的Activity或其他组件里,创建了TextView或Button试图,这里就相当于注册回调,重载该方法就相当于实现自定义回调方法,

最后你点击某个按键是就会触发该回调事件了。


整个过程为:Activity注册回调函数,事件触发后调用,该回调函数调用Activity中的组件(TextView,Button等)onKeyDown方法。


其他几个事件,原理相同,具体处理细节不再赘述。(onKeyUp,onTouchEvent,onTrackBallEvent,onFocusChanged等等,就只有遇到问题在具体分析了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值