Android提供了強大的時間處理機制,包括兩套事件處理機制:
- 基於監聽的事件處理。
- 基於回調的事件處理(適合處理那種處理邏輯比較固定的View)。
對於基於回調的事件處理模型來說,事件源和事件監聽器是統一的,當事件源發生特定事件後,該事件還是事件源本身負責處理。
一、所謂的回調,在實現具有通用性質的應用架構時非常常見:對於一個具有通用架構的程序來說,程序架構完成整個程序的通用功能、流程,但在某個特定的點上,需要一段業務相關的代碼——通用的程序架構無法實現這段代碼,那麼程序架構會在這個點上留一個“空”。
對於Java程序來說,程序架構在這個點上的留的“空”,可以以一下兩種方式存在。
- 以接口形式存在:該接口由開發者實現,實現該接口時會實現該接口的方法,那麼通用的程序架構就會調用該方法來完成相關業務的處理。
- 以抽象方法(也可以說是非抽象方法)的形式存在:這就是Activity的實現形式,這些特定的點上的方法已經被定義了,如onCreate,onActivityResult等方法,開發者可以選擇性地重寫這些方法,通用的程序架構就會回調這些方法來完成相關業務的處理。
幾乎所有基於回調的事件處理方法都有一個boolean類型的返回值,該返回值用於標識該處理方法是否能完全處理該事件:
- 如果處理事件的回調方法返回true,表明該處理方法已完全處理該事件,該事件不會傳播出去。
- 如果事件處理的回調方法返回false,表明該處理方法並未完全處理事件,該事件會傳播出去。
某組件上發生的事情不僅激發該組件上的回調方法,也會觸發該組件所在Activity的回調方法——只要事件能傳播到該Activity。
例如,當某個組件上發生某個按鍵按下的事件時,Android系統最先觸發的應該是該按鍵上綁定的監聽器,接着才觸發該組件個的事件回調方法,然後還會傳播到該組件所在的Activity。當然前提是事件處理方法返回的是false。
二、所謂的事件監聽器,其實就是實現了特定接口的java類的實例。
在程序中實現事件監聽器通常有以下幾種形式:
- 內部類形式:將事件監聽器類定義爲當前類的內部類、
- 外部類形式:將事件監聽器定義爲一個外部類。
- Activity本身作爲事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法。
- 匿名內部類形式:使用匿名內部類創建事件監聽器對象。
對比Android提供的這兩種事件處理模型,會發現基於監聽的事件處理模型更具優勢:
基於監聽的事件模型分工更明確,事件源、事件監聽的兩個類分開實現,隱刺具有更好的可維護性。
Android的事件處理機制保證基於監聽的事件監聽器會被優先觸發。
Android爲不同組件通過了不同的監聽接口:
一、View
- View.onClickListener:單擊事件的事件監聽器必須實現的接口。
- View.onCreateContextMenuListener:創建上下文菜單事件的事件監聽器必須實現的接口。
- View.onFocusChangedListener:焦點改變事件的事件監聽器必須實現的接口。
- View.onKeyListener:按鍵事件的時間監聽器必須實現的接口。
- View.onLangClickListener:長單擊事件的事件監聽器必須實現的接口。
- View.onTouchListener:觸摸屏事件的事件監聽器必須實現的接口。
Android爲不同的組件也通過了一些事件處理的回調方法:
一、View
- boolean onKeyDown(int keyCode,KenyEvent enent):當用戶在該組件上按下某個鍵時觸發的方法。
- boolean onKeyLongPress(int keyCode,KeyEvent event):當用戶在該組件上長按某個按鍵時觸發的方法。
- boolean onKeyShortcut(int keyCode,KeyEvent event):當一個鍵盤快捷鍵事件觸發時 觸發的方法。
- boolean onKeyUp(int keyCode,KeyEvent event):當用戶在該組件上鬆開某個按鍵時觸發的方法。
- boolean onTouchEvent(MotionEvent event):當用戶子在該組件上觸發觸摸屏事件時 觸發的方法。
- boolean onTrackballEvent(MotionEvent event):當用戶在該組件上觸發軌跡球屏事件時觸發該方法。