Android系統的事件處理概述

2021-01-07 網易

  通過對Android基本組件的學習,也有接觸少部分Android的事件處理,比如按鈕的點擊事件、選框的狀態切換事件。

  

  一、Android事件處理

  Android提供了兩種方式的事件處理:基於回調的事件處理和基於監聽的事件處理。

  

基於監聽的事件處理:主要做法就是為Android界面組件綁定特定的事件監聽器,前面小節已經見到大量這種事件處理的示例。
基於回調的事件處理:主要做法就是重寫Android組件特定的回調方法, 或者重寫Activity的回調方法。Android為絕大部分界面組件都提供了事件響應的回調方法,開發者只要重寫它們即可。

  一般來說,基於回調的事件處理可用於處理一些具有通用性的事件,基於回調的事件處理代碼會顯得比較簡潔。但對於某些特定的事件,無法使用基於回調的事件處理,只能採用基於監聽的事件處理。

  本期先來學習基於監聽的事件處理,後面再學習基於回調的事件處理,關注分享達人秀(ShareExpert)獲取第一手教程,也可以加小編微信(jinwenyu2010)拽入Android零基礎入門技術討論微信群共同進步。

  二、基於監聽的事件處理概述

  基於監聽的事件處理是一種更「面向對象」的事件處理,在事件監聽的處理模型中主要涉及如下三類對象。

  

Event Source (事件源):事件發生的場所,通常就是各個組件,例如按鈕、窗口、菜單等。
Event (事件):事件封裝了界面組件上發生的特定事情(通常就是一次用戶操作)。如果程序需要獲得界面組件上所發生事件的相關信息,一般通過Event對象來取得。
Event Listener (事件監聽器):負責監聽事件源所發生的事件,並對各種事件做出相應的響應。

  當用戶按下一個按鈕或者單擊某個菜單項時,這些動作就會激發一個相應的事件,該事件就會觸發事件源上註冊的事件監聽器(特殊的Java對象),事件監聽器調用對應的事件處理器 (事件監聽器裡的實例方法)來做出相應的響應。

  每個組件均可以針對特定的事件指定一個事件監聽器,每個事件監聽器也可監聽一個或多個事件源。因為同一個事件源上可能發生多種事件,委派式事件處理方式可以把事件源上所有可能發生的事件分別授權給不同的事件監聽器來處理;同時也可以讓一類事件都使用同一個事件監聽器來處理。

  Android事件處理流程如下圖所示:

  

  從上圖可以知道,基於監聽的事件處理模型的流程如下:

  

為某個事件源(界面組件)設置一個監聽器,用於監聽用戶操作。
當用戶操作時,會觸發事件源的監聽器。
生成了對應的事件對象。
將這個事件源對象作為參數傳給事件監聽器。
事件監聽器對事件對象進行判斷,執行對應的事件處理器(對應事件的處理方法)。

  Android中基於監聽的事件處理模型的開發步驟如下。

  

獲取普通界面組件(事件源),也就是被監聽的對象。
實現事件監聽器類,該監聽器類是一個特殊的Java類,必須實現一個XxxListener接口。
調用事件源的setXxxListener方法將事件監聽器對象註冊給普通組件(事件源)。

  對於這三件事情,事件源可以是任何界面組件,不太需要開發者參與;註冊監聽器也只要一行代碼即可,因此事件編程的關鍵就是實現事件監聽器類。

  在基於監聽的事件處理模型中,事件監聽器必須實現事件監聽器接口,Android為不同的界面組件提供了不同的監聽器接口,這些接口通常以內部類的形式存在。以View類為例,它包含了如下幾個內部接口。

  

View.OnClickListener:單擊事件的事件監聽器必須實現的接口。
View.OnCreateContextMenu Listener :創建上下文菜單事件的事件監聽器必須實現的接口。
View.onFocusChangeListener:焦點改變事件的事件監聽器必須實現的接口。
View.OnKeyListener:按鍵事件的事件監聽器必須實現的接口。
View.OnLongClickListener:長按事件的事件監聽器必須實現的接口。
View.OnTouchListener:觸摸事件的事件監聽器必須實現的接口。

  通過前面的學習,知道事件監聽器就是實現了特定接口的Java類的實例。在程序中實現事件監聽器,通常有如下幾種形式。

  

匿名內部類形式:使用匿名內部類創建事件監聽器對象。
內部類形式:將事件監聽器類定義成當前類的內部類。
外部類形式:將事件監聽器類定義成一個外部類。
Activity本身作為事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法。
直接綁定到標籤形式:直接在xml布局文件對應的Activity中定義一個事件處理方法,然後在布局文件中引用要觸發的事件。

  三、使用匿名內部類作為事件監聽器

  大部分時候,事件處理器都沒有什麼復用價值(可復用代碼通常都被抽象成了業務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。實際上,這種形式是目前使用最廣泛的事件監聽器形式,在前面的基本組件學習中也是使用的該種方法來綁定監聽器。

  接下來通過一個簡單的示例程序來學習Android使用匿名內部類作為事件監聽器。

  同樣使用WidgetSample工程,繼續使用app/main/res/layout/目錄下的activity_main.xml文件,在其中填充如下代碼片段:

  

  為了監聽按鈕的點擊事件,在Java代碼中為其添加點擊事件監聽器,具體代碼如下:

  

  上面程序中的粗體字部分使用匿名內部類創建了一個事件監聽器對象,「new監聽器接口」或「new事件適配器」的形式就是用於創建匿名內部類形式的事件監聽器。

  運行程序,點擊按鈕,可以看到下圖所示界面效果。

  

  對於使用匿名內部類作為事件監聽器類的形式來說,唯一的缺點就是匿名內部類的語法有點不易掌握,如果Java基礎紮實,匿名內部類的語法掌握較好,通常建議使用匿名內部類作為監聽器類。

  Android中基於監聽的事件處理的其他四種形式下期再繼續學習。

  今天就先到這裡,如果有問題歡迎留言一起探討,也歡迎加入Android零基礎入門技術討論微信群,共同成長!

  此文章版權為微信公眾號分享達人秀(ShareExpert)——鑫鱻所有,若需轉載請聯繫作者授權,特此聲明!

  往期總結分享:

  Android零基礎入門第1節:Android的前世今生

  Android零基礎入門第2節:Android 系統架構和應用組件那些事

  Android零基礎入門第3節:帶你一起來聊一聊Android開發環境

  Android零基礎入門第4節:正確安裝和配置JDK, 高富帥養成第一招

  Android零基礎入門第5節:善用ADT Bundle, 輕鬆邂逅女神

  Android零基礎入門第6節:配置優化SDK Manager, 正式約會女神

  Android零基礎入門第7節:搞定Android模擬器,開啟甜蜜之旅

  Android零基礎入門第8節:HelloWorld,我的第一趟旅程出發點

  Android零基礎入門第9節:Android應用實戰,不懂代碼也可以開發

  Android零基礎入門第10節:開發IDE大升級,終於迎來了Android Studio

  Android零基礎入門第11節:簡單幾步帶你飛,運行Android Studio工程

  Android零基礎入門第12節:熟悉Android Studio界面,開始裝逼賣萌

  Android零基礎入門第13節:Android Studio配置優化,打造開發利器

  Android零基礎入門第14節:使用高速Genymotion,跨入火箭時代

  Android零基礎入門第15節:掌握Android Studio項目結構,揚帆起航

  Android零基礎入門第16節:Android用戶界面開發概述

  Android零基礎入門第17節:TextView屬性和方法大全

  Android零基礎入門第18節:EditText的屬性和使用方法

  Android零基礎入門第19節:Button使用詳解

  Android零基礎入門第20節:CheckBox和RadioButton使用大全

  Android零基礎入門第21節:ToggleButton和Switch使用大全

  Android零基礎入門第22節:ImageView的屬性和方法大全

  Android零基礎入門第23節:ImageButton和ZoomButton使用大全

  Android零基礎入門第24節:自定義View簡單使用,打造屬於你的控制項

  Android零基礎入門第25節:簡單且最常用的LinearLayout線性布局

  Android零基礎入門第26節:兩種對齊方式,layout_gravity和gravity大不同

  Android零基礎入門第27節:正確使用padding和margin

  Android零基礎入門第28節:輕鬆掌握RelativeLayout相對布局

  Android零基礎入門第29節:善用TableLayout表格布局

  Android零基礎入門第30節:兩分鐘掌握FrameLayout幀布局

  Android零基礎入門第31節:少用的AbsoluteLayout絕對布局

  Android零基礎入門第32節:新推出的GridLayout網格布局

  

  

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關焦點

  • Android中基於監聽的事件處理
    上一期我們學習了Android中的事件處理,也詳細學習了Android中基於監聽的事件處理,同時學會了匿名內部類形式,那麼本期繼續來學習其他四種事件監聽器。
  • Android Systrace 基礎知識(9)-MainThread 和 RenderThread 解讀
    開始一幀的繪製處理 App 這一幀的 Input 事件(如果有的話)處理 App 這一幀的 Animation 事件(如果有的話)處理 App 這一幀的 Traversal 事件(如果有的話)主線程與渲染線程同步渲染數據,同步結束後,主線程結束一幀的繪製,可以繼續處理下一個 Message(如果有的話,IdleHandler 如果不為空,這時候也會觸發處理),或者進入 Sleep 狀態等待下一個
  • Android系統啟動流程(四)Launcher啟動過程與系統啟動流程
    1.Launcher概述Android系統啟動的最後一步是啟動一個Home應用程式,這個應用程式用來顯示系統中已經安裝的應用程式,這個Home應用程式就叫做Launcher。frameworks/base/services/core/java/com/android/server/am/ActivityStack.java
  • Android解析WindowManager(三)Window的添加過程
    1.概述WindowManager對Window進行管理,說到管理那就離不開對Window的添加、更新和刪除的操作,在這裡我們把它們統稱為Window的操作。對於Window的操作,最終都是交由WMS來進行處理。窗口的操作分為兩大部分,一部分是WindowManager處理部分,另一部分是WMS處理部分。
  • Android PMS處理APK的複製
    前言在上一篇文章Android包管理機制之PackageInstaller安裝APK中,我們學習了PackageInstaller是如何安裝APK的,最後會將APK的信息交由PMS處理。那麼PMS是如何處理的呢?主要是APK的複製和安裝,由於公號文章字數的限制,這篇文章只能介紹 PMS處理APK的複製,APK安裝過程會在後續文章講解。
  • Android上玩玩Hook:Cydia Substrate實戰
    我們知道,在Android作業系統中系統維護著自己的一套事件分發機制。應用程式,包括應用觸發事件和後臺邏輯處理,也是根據事件流程一步步的向下執行。而「鉤子」的意思,就是在事件傳送到終點前截獲並監控事件的傳輸,像個鉤子勾上事件一樣。並且能夠在勾上事件時,處理一些自己特定的事件。如下圖所示:
  • android基礎入門
    第一天、android簡介和開發環境的搭建:android的簡介android開發環境搭建android工程的目錄介紹>第一個應用程式——計算器部署到真實手機第二天、android的系統架構和核心模塊簡介:
  • Android scrollView
    報名請點擊文章末尾的【閱讀原文】。結構繼承關係public class ScrollView extends FrameLayoutjava.lang.Objectandroid.view.Viewandroid.view.ViewGroupandroid.widget.FrameLayoutandroid.widget.ScrollView
  • Android Systrace 基礎知識(5) - SurfaceFlinger 解讀
    為了適應這些選項,HWC 會執行以下計算(由於硬體供應商可以定製決策代碼,因此可以在每臺設備上實現最佳性能):SurfaceFlinger 向 HWC 提供一個完整的層列表,並詢問「您希望如何處理這些層?」HWC 的響應方式是將每個層標記為疊加層或 GLES 合成。SurfaceFlinger 會處理所有 GLES 合成,將輸出緩衝區傳送到 HWC,並讓 HWC 處理其餘部分。
  • Android系統啟動流程(三)解析SyetemServer進程啟動過程
    frameworks/base/core/java/com/android/internal/os/RuntimeInit.javaframeworks/base/core/java/com/android/internal/os/RuntimeInit.java
  • Android 設備按鍵詳解
    PhoneWindowManager 長按Home 建啟動Google Now自己實現常按Home 鍵吊起Google Now方法,供在按鍵分發處理事件時候調用。在按鍵事件分發之前處理在按鍵分發處理之前調用自定義長按Home鍵的方法
  • 【Android基礎學習一】Android 常用 adb 命令總結
    ,需要 root ,並且一般的 Android 機 root 之後並不能使用命令去複製,而需要在手機上使用類似於 RE 的文件瀏覽器,先對系統的文件系統進行掛載為可讀寫後,才能在手機上複製移動系統文件,這裡推薦使用小米手機的開發版本,IUNI 也是不錯滴~~adb push , 推送本地文件至 Android 設備例如推送 D 盤下的 push.txt 至 Sdcard
  • Android壓力測試Monkey工具
    它向系統發送偽隨機的用戶事件流(如按鍵輸入、觸控螢幕輸入、手勢輸入等),實現對正在開發的應用程式進行壓力測試。Monkey測試是一種為了測試軟體的穩定性、健壯性的快速有效的方法。二、 Monkey的特徵1、測試的對象僅為應用程式包,有一定的局限性。2、 Monky測試使用的事件流數據流是隨機的,不能進行自定義。
  • Android平臺View的按鍵事件KeyDown用法
    Android平臺View的按鍵事件KeyDown用法 發表於2011-12-28 13:51| 來源未知| 作者張京晶
  • Android系統編譯指南
    $ git branch -a* linux_android_development master remotes/origin/A/B_update_linux_android_development remotes/origin/HEAD -> origin/master ... ...
  • 介紹一下 Android Handler 中的 epoll 機制?
    與多進程和多線程技術相比,IO 多路復用技術的最大優勢是系統開銷小,系統不必為每個 IO 操作都創建進程或線程,也不必維護這些進程或線程,從而大大減小了系統的開銷。select、poll、epoll 就是 IO 多路復用三種實現方式。
  • Android測試 常用adb 命令總結
    ,需要 root ,並且一般的 Android 機 root 之後並不能使用命令去複製,而需要在手機上使用類似於 RE 的文件瀏覽器,先對系統的文件系統進行掛載為可讀寫後,才能在手機上複製移動系統文件,這裡推薦使用小米手機的開發版本,IUNI 也是不錯滴~~adb push , 推送本地文件至 Android 設備例如推送 D 盤下的 push.txt 至 Sdcard
  • 經驗丨Android開發最佳實踐
    當安裝有些包含SDK的IDE的時候,可能會將SDK放在IDE同一目錄下,當你需要升級(或重新安裝)IDE或更換的IDE時,會非常麻煩。 此外,若果你的IDE是在普通用戶,不是在root下運行,還要避免吧SDK放到一下需要sudo權限的系統級別目錄下。構建系統你的默認編譯環境應該是Gradle. Ant 有很多限制,也很冗餘。
  • 如何自學Android, 教大家玩爆Android
    五大布局的精簡使用介紹可以參考下面幾篇博文: LinearLayout、AbsoluteLayout RelativeLayout、FrameLayout TableLayout (一) TableLayout (二)五大布局詳細介紹使用可以參考這篇博文: Android系統五大布局詳解
  • Android開發之:Toast和Notification
    本節詳細講解Toast和Notification控制項的級本概述,後續我們會介紹具體使用方法。  Toast簡介  Toast是Android中用來顯示信息的一種機制,和Dialog不一樣的是,Toast 是沒有焦點的,而且Toast顯示的時間有限,過一定的時間就會自動消失。例如,在下面的代碼中,編寫了Activity的子類別ToastDemo。