您的位置:首页 > 移动开发 > Android开发

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

2013-08-15 17:34 465 查看
最近在看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
plaincopy

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接口,也就是回调函数

[java] view
plaincopy

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方法而能自定该事件动作。

[java] view
plaincopy

public class TextView extends View implements ... {  

[java] view
plaincopy

....................  

@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等等,就只有遇到问题在具体分析了)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: