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)

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

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源码,非常感谢。


此为自娱自乐而写,以待以后更了解后在来改进...


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值