標籤:activity 訊息響應 監聽 回調 android事件處理
本章主要涉及內容有:
一、Android事件處理機制,其中包括監聽和回調兩種處理機制
二、Configuration類
三、Handler、Loop及MessageQueue
四、AsyncTask
一、監聽機制和回調機制
1.1-監聽機制
監聽事件處理模型包括三類對象:事件來源、事件和事件監聽器。其中事件來源為事件發生的場所/組件,事件為使用者動作,事件監聽器則負責監聽並處理事件。
以使用者點擊某Button後,在主介面中顯示Toast這一過程為例,其中:
事件來源為Button
事件為使用者點擊該Button
事件監聽器(此處為onClickListener)負責監聽並處理該事件(顯示Toast)
典型的代碼實現:
btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplication(), "Btn Clicked", Toast.LENGTH_SHORT).show();}});監聽器的實現形式主要有四種:內部類形式、外部類形式、Activity本身作為事件監聽器類、匿名內部類形式
代碼中實現方式為匿名內部類形式,這也是最常用的形式。
1.2-回調機制
回調與監聽機制的不同之處主要在於:監聽機制中,由事件監聽器負責監聽及處理髮生的事件。而在回調機制中,事件來源中已經寫好了事件發生時應如何處理,即處理事件這一動作由事件來源本身完成,而不是託付給事件監聽器。重載回呼函數後將該View置於Activity的layout布局檔案中即可。
注意,此處回呼函數的返回值為boolean型。若返回true,表示事件處理完成後不會向上傳遞。返回false,則表示會繼續將該事件傳遞給更上一層進行處理。
同樣以點擊Button為例,若Button中返回false,則在Button的回呼函數中處理完該事件後,會繼續調用放置Button的Activity中響應回呼函數進行處理。
代碼實現:
public class MyButton extends Button {public MyButton(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}@Overridepublic boolean onTouchEvent(MotionEvent e){Toast.makeText(getContext(), "Btn Clicked", Toast.LENGTH_SHORT).show();return true;}}
若同時實現了監聽和回調機制,則調用順序為監聽->回調。以此處為例,若同時實現了兩者,則會先調用監聽器中的onClickListener,再回調onTouchEvent。
二、Configuration類:用於擷取裝置狀態的類,Android可調用Activity的如下方法擷取系統的Configuration對象:
Configuration cfg = getResource().getConfiguration();
三、Handler、Loop及MessageQueue
Android中不允許子線程執行UI操作,只能通過利用Handler達到目的。
Handler的主要作用有兩個:
1.在新啟動的線程中發送訊息
2.在主線程中擷取、處理訊息
Handler處理的訊息來源於MessageQueue,而MessageQueue由Loop進行管理。
子線程需要執行UI操作的流程為:子線程將訊息請求加入至MessageQueue的末尾->主線程從子線程的MessageQueue中擷取到該訊息後,回調子線程中的handleMessage函數,執行處理動作。
實現有UI操作需求子線程類,在public void run()中需編寫以下幾步:
1.調用Looper.prepare();建立該線程的MessageQueue
2.定義Handler,重載handleMessage函數。主線程從子線程的MessageQueue中取出訊息後回調該函數執行UI操作
3.Looper.loop();啟動Looper。
主UI線程中系統已初始化了一個Looper對象,因此不需要執行Looper.prepare,Looper.loop()
四、AsyncTask
略
瘋狂Android講義第三章-Android的事件處理