標籤:android style blog http io ar color os 使用
1.事件處理概述與Android事件處理 事件處理:當使用者在程式介面上執行各種操作時,應用程式必須為使用者動作提供相應動作,這種相應動作就需要通過事件處理來完成
兩種:
1.基於監聽器的事件處理
(優先觸發) 方法:綁定特定的事件監聽器setOnclickListener。還允許UI組件的android:onClick屬性指定事件監聽方法再在Activity中定義該事件 監聽方法。 eg:android:onClick = "clickHandler" 則在Activity中定義一個clickHandler(View source)方法,該方法將會負責處理該按鈕上的單擊事件。 事件監聽的處理模型主要涉及如下三類對象: ->Event Source(事件來源):事件發生的場所,就是各個組件(按鈕、視窗) ->Event :事件封裝了介面組件上發生的特定事情,如果程式需要活的介面組件上所發生事件的相關資訊,一般通過Event對象獲得。 ->Event Listener :負責監聽事件來源所發生的事件,並對各種事件做出相應的相應。
Android使用的是委派式(Delegation)事件處理方式:普通組件(事件來源)將整個事件處理委託給特定的對象(事件監聽器),當該事件 源發生指定的事件時,就通知所委託的事件處理器(事件監聽器裡的執行個體方法)來做出相應的響應。 事件編程的關鍵就是實現事件監聽器類。如果事件發生時有較多的資訊需要傳給事件監聽器,那麼就需要將事件資訊封裝成Event對象, 該Event對象將作為參數傳入事件處理函數。 監聽器介面:OnclickListener:單擊事件 OnCreateContentMenuListener:建立操作功能表事件 OnFocusChangeListener:焦點改變事件 OnKeyListener:按鍵事件 OnLongClickListener:長單擊事件 OnTouchListener:觸控螢幕事件
程式中實現事件監聽器形式: 1>內部類形式:將事件監聽器定義成當前類的內部類; 2>外部類形式:在某個事件監聽器被多個GUI介面共用時; 3>Activity本身作為事件監聽器類:讓Activity本身實現監聽器介面,實現事件處理方法; 4>內部匿名類:使用內部匿名類建立事件監聽器對象,因為事件處理器沒有複用價值。
2.基於回調的事件處理(提高程式內聚性) 與事件監聽機制不同的是,當事件來源發生特定事件之後,該事件還是由事件來源本身負責處理。使用者在GUI 組件上激發某個事件,組件 自己的特定的方法將會負責處理該事件。我們只能繼承GUI類,並重寫該類的事件處理方法。所謂提高內聚型,就是把事件處理方法 封裝在內部,它更適合於應付那種事件處理邏輯比較固定組件。
基於回調的事件傳播:基於回調是事件處理方法都有一個布爾類型傳回值,用於標識該處理方法是否能完全處理該事件,是為true。 重寫onTouchEvent方法可以相應觸控螢幕事件。
2.相應的系統設定的事件
應用程式監聽系統設定的更改,對系統設定的更改做出相應。Configuration類用於描述手機裝置上的配置資訊(使用者特定的配置項, 系統的動態裝置配置)。 擷取系統的Configuration對象:Configuration cfg = getResources().getConfiguration(); 擷取系統配置資訊常見屬性:P210
監聽系統設定的更改:重寫onConfigurationChanged響應系統設定更改。 用Activity的setRequestedOrientation(int)來修改螢幕的方向。
3.Handler訊息傳遞機制
為什麼只允許UI進程修改Activity裡的UI組件? 如果有多個線程並行作業UI組件,會導致安全執行緒問題。 當一個程式第一次啟動時,Android會啟動一條主線程Main Thread,主線程主要負責處理與UI有關的組件。 Handler存在的意義? Android只允許UI線程修改Activity的UI組件,會導致新啟動的線程無法動態修改介面組件的屬性值,需要藉助Handler的訊息傳遞 機制來實現。 Handler作用:把訊息發送給Looper管理的MessageQueue,並負責處理Looper分給它的訊息。 Looper作用:每個線程1個Looper來管理MessageQueue,會不斷地從MessageQueue中取出訊息,並將訊息分給對應該Handler處理。 Looper建立過程有2種:1.主UI系統自己初始化了Looper對象,因此程式直接建立Handler就可以通過它發送處理訊息。 2.自己啟動的子線程,必須自己建立一個Looper對象,並啟動,Looper.prepare()方法 和Looper.Loop()。 這裡的線程只得是有handMessage的線程。資料從主線程->其他線程必須要: Looper.prepare() handMessage(Message msg) Looper.loop 迴圈 MessageQueue作用:由Looper負責管理,FIFO方式
4.非同步任務
(AsyncTask) 為瞭解決新的線程不能更新UI的問題,Android有如下解決方案: 1.Handler實現線程之間的通訊 2.Activity.runOnUiThread(Runnable) 3.View.post(Runnable) 4.View.postDelayed(Runnable,long) 初此之外,AsyncTask更加輕量些,適合簡單的非同步作業,不需要藉助線程和Handler即可實現。P220
來自為知筆記(Wiz)
Android事件處理