首页 > 代码库 > 理解Android事件处理机制
理解Android事件处理机制
Android的事件处理机制分为两大类:基于监听器和基于回调
1、基于监听器的事件处理
这种处理方式和Java的GUI组件监听器的几乎一样,是一种委托式的处理办法。即如果View组件(事件源)被单击或者长按(事件)后,系统将这个单击事件委托给特定对象(监听器)处理,特定对象可以是Listener对象也可以是组件指定的事件处理方法。这里涉及到三个成员:事件源,事件和监听器。其中监听器是核心,它包含了事件的处理的实现。
下面是一个简单的Button监听器,采用匿名内部类的实现形式。界面布局文件只是线性布局文件下的按钮,比较简单,就不给出了。
1 public class TestActivity extends Activity { 2 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.main); 8 //获取Button组件 9 Button btn=(Button) findViewById(R.id.btn);10 //为该组件设置监听器11 btn.setOnClickListener(new OnClickListener(){12 13 //重载事件处理方法14 @Override15 public void onClick(View v) {16 // TODO Auto-generated method stub17 //一个简单的提示文本18 Toast.makeText(TestActivity.this,19 "按钮被单击了",20 Toast.LENGTH_SHORT).show();21 }22 23 });24 }25 }
可以看出,该处理模型的编程步骤大体分为三步:
一、获取组件findViewById,即事件源;
二、编写监听器类,该类要实现一个XxxListener接口;
三、调用事件源的setXxxListener方法给组件注册监听器。
2、基于回调的事件处理
要理解基于回调的事件处理,首先要明白什么是回调。
回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。(FROM 维基百科)
C++中的函数回调是通过指针实现的,即传入一个函数指针;而在Java中是通过接口或内部类实现的
关于Java回调机制的理解,可以参考这份很不错的文章http://hellosure.iteye.com/blog/1130176
在回调机制中,如果你在界面布局文件里定义了一个组件,这个时候系统认为你注册了一个回调,当这个组件被点击或者被长按时,就会触发回调事件,系统会调用相应的回调方法,比如boolean onKeyDown(int keyCode,KeyEvent event),当然你也可以通过重载来自定义该回调方法。
下面是一个例子
1 public class MyButton extends button 2 { 3 public MyButton(Context context,AttributeSet set){ 4 super(context,set); 5 } 6 //自定义回调方法 7 @Override 8 public boolean onKeyDown(int keyCode,KeyEvent event){ 9 super.onKeyDown(keyCode,event);10 return true;11 }12 }
实际上,基于监听器的事件处理也用到了回调函数。
3、两种方式的区别
在事件传播顺序上是监听器->回调方法->Activity,因此可以知道Android的处理机制是保证事件监听器被优先触发。同时,采用事件监听的方式使得事件源与事件监听器的分离,具有更好的可维护性,在处理特殊业务逻辑上有明显优势;而基于回调的方式由于将事件源与监听器统一,更适合处理那些通用的、业务逻辑固定的事件。