Android事件处理模型

事件处理是Android编程中非常重要的一个部分,因为Android应用在运行过程中会产生许多各种各样的事件(动作),应用必须为这些动作执行对应的响应代码;将产生的动作和响应联系起来的方式就是事件处理机制。Android平台提供了两种事件处理机制,分别是基于监听的模式和基于回调的模式。

1. 基于监听的事件处理模型

1.1 组成部分

  • 事件源:事件发生的地方,比如某个按钮、文本框等
  • 事件:事件类型,通过Event对象表达
  • 事件监听器:负责监听某种的事件类型,并执行相应的操作

基于监听的事件处理模型首先需要创建一个事件监听器,该事件监听器可以监听某一类型的事件;然后,把事件监听器注册到某个组件中;当该组件上发生了可以被该监听器监听的动作后,组件会产生一个代表该动作的Event对象,并把Event对象传递给监听器。在Android中,生成Event对象以及Event对象的传递不需要程序员介入,系统会自动去处理这一步操作。程序员需要做的就是指定事件源,并在该事件源上注册对应于某个事件类型的事件监听器,并重写相应的处理代码。

xml布局代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/btn_click"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Click"
        />
</RelativeLayout>

Java代码

public class MainActivity extends Activity {
    private Button mClickBtn;
    // 创建监听器,监听“点击”事件
    final View.OnClickListener listener =
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    L.d("You click btn_click!");
                }
            };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mClickBtn = (Button) findViewById(R.id.btn_click);

    // 为mClickBtn组件设置事件类型为‘点击’的监听器
    mClickBtn.setOnClickListener(listener);
}

}

上述代码在MainActivity中创建了一个监听器listener,该监听器负责监听“点击”事件,然后在onCreate方法中通过setOnClickListener方法将该监听器注册到mClickBtn上。

在上述代码中,监听器通过匿名内部类实现,并创建了一个该匿名内部类的对象,然后将该对象注册到事件源上,这种方式与直接在设置监听器的位置新建监听器(如下所示)相比,好处在于该监听器对象可以重用。

mClickBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        L.d("You click btn_click!");
    }
});

注意

  • 一般监听器都通过内部类实现,因为内部类可以访问到外部类中包含的组件或字段,而一般监听器都会涉及到对外部类中相关组件或字段的操作。如果通过外部类实现,还需要传递本类的引用,而且代码也不是很直观。
  • 一般在监听器中不实现业务逻辑,如果监听器确实需要处理逻辑,可以把逻辑封装在外部类的方法中,然后在监听器中调用该方法(监听器只负责简单的数据展示或数据传递,逻辑处理通过专门的方法实现,这种编码方式更符合面向对象的设计原则)

2. 基于回调的事件处理模型

上面所说的基于监听的处理方式是一种委托的事件处理方式,即将事件处理委托给专门负责处理事件的监听器;而接下来要讨论的基于回调的处理方式则是一种主动式的事件处理方式,即事件由事件源本身处理。从代码实现上来说,要添加事件处理的组件需要实现特定的接口,并重写接口中的某些方法;当对应的事件发生时,系统会回调该组件中被重写的方法。举个例子

XML布局代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <org.xiuyuan.androidfundemantal.widget.MyButton
        android:id="@+id/btn_click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        />
</RelativeLayout>

Java代码

// 自定义MyButton类
public class MyButton extends Button {

    public MyButton(Context context, AttributeSet set) {
    super(context, set);
    }

// 设置回调函数
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        Log.i("MyButton", "MyButton onKeyDown");
        return false;
    }
}

public class MainActivity extends Activity {

    private Button mClickBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mClickBtn = (Button) findViewById(R.id.btn_click);

    // 设置监听器
        mClickBtn.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                Log.i("mClickBtn", "onKeyListener");
                return false;
            }
        });
    }

// 设置Activity回调函数
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        Log.i("MainActivity", "MainActivity onKeyDown");
        return false;
    }
}

运行上述代码后,在logcat中会打印:

onKeyListener

MyButton onKeyDown

MainActivity onKeyDown

也就是说,事件发生后被调用的先后顺序是:监听器 –> 组件的回调函数;当组件回调函数返回的值为false时,事件会继续向上传播,所以会继续调用Acitivity中的回调函数;如果监听器中的onKey方法返回true,则不会调用组件的回调函数。

时间: 2025-01-03 19:02:28

Android事件处理模型的相关文章

理解Android事件处理机制

Android的事件处理机制分为两大类:基于监听器和基于回调 1.基于监听器的事件处理 这种处理方式和Java的GUI组件监听器的几乎一样,是一种委托式的处理办法.即如果View组件(事件源)被单击或者长按(事件)后,系统将这个单击事件委托给特定对象(监听器)处理,特定对象可以是Listener对象也可以是组件指定的事件处理方法.这里涉及到三个成员:事件源,事件和监听器.其中监听器是核心,它包含了事件的处理的实现. 下面是一个简单的Button监听器,采用匿名内部类的实现形式.界面布局文件只是线

Android零基础入门第33节:Android事件处理概述

通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Android事件处理 Android提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理. 基于监听的事件处理:主要做法就是为Android界面组件绑定特定的事件监听器,前面小节已经见到大量这种事件处理的示例. 基于回调的事件处理:主要做法就是重写Android组件特定的回调方法, 或者重写Activity的回调方法.Android为绝大部分界面组件都提供了事件

Android 事件模型

本文内容 基于监听的事件模型 基于回调的事件模型 Android 支持两种事件模型,基于监听的事件模型和基于回调的事件模型. 基于监听的事件模型 基于监听的事件模型是一种委托式的,更"面向对象"的事件处理,这跟 Java(或 C#)是一样的. 事件监听处理模型有三个对象: 事件源(Event Source),也就是 GUI 组件. 事件(Event),也就是 Event 对象,GUI 组件上所发生事件的相关信息. 事件监听器(Event Listener),负责监听事件源所发生的事件,

【Android应用开发技术:应用组件】Android事件处理机制

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 事件处理:不管是桌面应用还是手机应用都需要去响应用户的动作,这种为用户动作提供响应的机制就是事件处理. Android提供了两套事件处理机制,如下所示: 基于监听的事件处理 基于回调的事件处理 一般来说,基于回调的事件处理可用于处理一些通用性的事件,但对于某些特定的事件只能使

Android 事件处理全面剖析

篇外话:先来说下今天的日期,今天是2015年02月18日也就是大年三十,大家都在欢欢喜喜的准备过大年,活动也各式各样,搓麻将.打扑克.放烟花.准备看春晚,而我却还在敲代码,我只想说身为程序员的我们,真的屌丝的不能再屌丝了.虽然很屌丝,但我在这里还是要给大家拜个年,祝大家羊年喜气洋洋.写出来的代码少 bug.产品少改需求!当然当大家看到这篇 blog 的时候已经过完了年,因为我写这篇 blog 是在家里,而我家里木有网络,所以还得等到到了工作之地才能放出来,好了,回归正题. Android 事件处

【Android开发精要笔记】Android组件模型解析

Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件的功能都可以被充分的复用.来自不同应用的组件可以有机地结合在一起,共同完成任务. 基于Mashup的Android应用模型 三个基本要素:组件.连接.配置 接口就是实现单元.从代码来看,组件就是派生自特定接口或基类的子类的实现,如界面组件Activity就是指派生自android.app.Activ

Android 事件处理

目的:通过全面的分析Android的鼠标和键盘事件.了解Android中如何接收和处理键盘和鼠标事件,以及如何用代码来产生事件. 主要学习内容: 1. 接收并处理鼠标事件:按下.弹起.移动.双击.长按.滑动.滚动 2. 接收并处理按键事件:按下.弹起 3. 模拟鼠标/按键事件 1. Android事件 现代的用户界面,都是以事件来驱动的来实现人机交换的,而Android上的一套UI控件,无非就是派发鼠标和键盘事件,然后每个控件收到相应的事件之后,做相应的处理.如Button控件,就只需要处理Do

Java NIO 与 基于reactor设计模式的事件处理模型

Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的. Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们

Android事件处理(章节摘要)

1,事件处理一定要有事件源,之后根据设置的事件处理类的不同,执行的操作也不同,每个组件基本上都存在自己的事件监听操作. 2,单击事件指在组件选中时进行触发. 3,使用下拉列表框可以完成级联子菜单的显示操作. 4,键盘事件可以对用户输入的数据进行监听. 5,触摸事件可以在用户单击屏幕时进行监听,使用触摸事件可以完成绘图的基本操作.Android事件处理(章节摘要)