最近在看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)
这也是基本的回调函数,就是供我们重载而自定义的部分
public class KeyEvent extends InputEvent implements Parcelable { public interface Callback { boolean onKeyDown(int keyCode, KeyEvent event); boolean onKeyLongPress(int keyCode, KeyEvent event); boolean onKeyUp(int keyCode, KeyEvent event); boolean onKeyMultiple(int keyCode, int count, KeyEvent event); } }
2. 然后是View 类它实现了KeyEvent的Callback接口,也就是回调函数
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
..........
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean result = false;
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER: {
if ((mViewFlags & ENABLED_MASK) == DISABLED) {
return true;
}
// Long clickable items don't necessarily have to be clickable
if (((mViewFlags & CLICKABLE) == CLICKABLE ||
(mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) &&
(event.getRepeatCount() == 0)) {
setPressed(true);
if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
postCheckForLongClick(0);
}
return true;
}
break;
}
}
return result;
}
..........
}
3. 最后是其他的组件如TextView,Button等,它们通过继承View,重载onKeyDown方法而能自定该事件动作。
public class TextView extends View implements ... {
.................... @Override public boolean onKeyDown(int keyCode, KeyEvent event) { int which = doKeyDown(keyCode, event, null); if (which == 0) { // Go through default dispatching. return super.onKeyDown(keyCode, event); } return true; } .................... }
那回调是怎么发生的哪?
在你的Activity或其他组件里,创建了TextView或Button试图,这里就相当于注册回调,重载该方法就相当于实现自定义回调方法,
最后你点击某个按键是就会触发该回调事件了。
整个过程为:Activity注册回调函数,事件触发后调用,该回调函数调用Activity中的组件(TextView,Button等)onKeyDown方法。
其他几个事件,原理相同,具体处理细节不再赘述。(onKeyUp,onTouchEvent,onTrackBallEvent,onFocusChanged等等,就只有遇到问题在具体分析了)
参考了一些网络资料和吴亚峰的Android核心技术,还有Android源码,非常感谢。
此为自娱自乐而写,以待以后更了解后在来改进...