一、事件概述
當使用者在程式介面上執行各種操作時,應用程式必須為使用者動作提供響應動作,這種響應動作需要通過事件處理來完成。Andorid提供了強大的事件處理機制,包括兩套事件處理機制:
基於監聽的事件處理:為Android介面組件綁定特定的事件監聽器;
基於回調的事件處理:重寫Android組件特定的回調方法,或者重寫Activity的回調方法;
注意:Android還允許在介面布局檔案中為UI組件的android:onClick屬性指定事件的監聽方法,開發人員需要在Activity定義該事件監聽方法,有一個View型別參數,代表單擊的組件;
二、基於監聽的事件處理
在事件監聽處理模型中,主要涉及如下三類對象:
Event Sources(事件來源):事件發生的場所,指各個組件;
Event(事件):封裝了介面組件上發生的特定事件,一般通過Event對象來取得;
Event Listener(事件監聽器):監聽事件來源發生的事件,並對各個事件做出相應的響應;
基於事件監聽的事件處理模型編程步步驟如下:
擷取普通介面組件(事件來源),也就是被監聽的對象;
實現事件監聽器類,該監聽器類是一個特殊的Java類,必須事件一個XxxListener介面;
呼叫事件源的setXxxListener方法將事件監聽器對象註冊給普通組件(事件來源);
在程式中實現事件監聽器,通常有如下方式:
內部類形式:將事件監聽器類定義成當前類的內部類;
外部類形式:將事件監聽類定義成一個外部類;
通常屬於特定的GUI介面,不利於提高程式的內聚性;
不能自由訪問建立GUI介面的類中的組件,編程不夠簡潔;
Activity本身作為事件監聽類:讓Activity本身實現監聽器介面,並實現事件處理方法;
Activity的主要職能應該是完成介面的初始化工作,造成程式結構混亂;
Activity實現監聽器介面,感覺怪異;
匿名內部類:使用匿名內部類建立事件監聽器對象;
大部分事件監聽知識臨時使用一次,所以使用匿名內部類更合適;
直接綁定到標籤:android:onClick屬性和xxx(View source)的方法;
三、基於回調的事件處理
對於基於回調的事件處理模型來說,事件來源和事件監聽器是統一的。為了實現回調機制地事件處理,Android為所有的GUI組件提供了一些事件處理方法,以View為例:
boolean onKeyDown(int keyCode,KeyEvent event):在該組件上按下某個鍵時觸發的方法;
boolean onKeyLongPress(int keyCode,KeyEvent event):在該組件上長按某個鍵時觸發的方法;
boolean onTouchEvent(MotionEvent event):在該組件上觸控螢幕事件時觸發的方法;
幾乎所有基於回調的事件處理方法都有一個boolean類型的返回值,該返回值使用者標識該處理方法是否能完全處理該事件:
返回true,已完全處理,不會傳播下去;
返回false,未完全處理,會傳播下去;
Android系統最先觸發的應該是該按鍵上綁定的事件監聽器(Listener),接著才觸發該組件提供的事件回調方法(MyButton),然後還會傳播到該組件所在的Activity(Activity)。