android學習之——Android事件處理(監聽和回調)

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):當用戶在該組件上觸發軌跡球屏事件時觸發該方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章