Android 編程基礎
2
Activity:
活動是最基本的 Android 應用程序組件,應用程序中,一個活動通常就是一個單獨的屏幕。每一個活動
都被實現為一個獨立的類,并且從活動基類中繼承而來,活動類將會顯示由視圖控件組成的用戶接口,并 對
事件做出響應。大多數的應用是由多個屏幕顯示組成。例如 : 一個文本信息的應用也許有一個顯示發送消息 的
聯系人列表屏幕,第二個屏幕用來寫文本消息和選擇收件人,再來一個屏幕查看消息歷史或者消息設置操 作
等。這里每一個這樣的屏幕就是一個活動,很容易實現從一個屏幕到一個新的屏幕并且完成新的活動。在 某
些情況下當前的屏幕也許需要向上一個屏 幕活動提供返回值 -- 比如讓用戶從手機中挑選一張照片返回通訊錄
做為電話撥入者的頭像。
當一個新的屏幕打開后,前一個屏幕將會暫停,并保存在歷史堆棧中。用戶可以返回到歷史堆棧中的 前
一個屏幕。當屏幕不再使用時,還可以從歷史堆棧中刪除。默認情況下, Android 將會保留從主屏幕到每一
個應用的運行屏幕。
簡單理解 Activity 代表一個用戶所能看到的屏幕, Activity 主要是處理一個應用的整體性工作,例如, 監
聽系統事件 ( 按鍵事件、觸摸屏事件等 ) 、為用戶顯示指定的 View ,啟動其他 Activity 等。所有應用的 Activit y
都繼承于 android.app.Activity 類,該類是 Android 提供的基層類,其他的 Activity 繼承該父類后,通過 Over ride
父類的方法來實現各種功能,這種設計在其他領域也較為常見。
Intent:
調用 Android 專有類 Intent 進行架構屏幕之間的切換。 Intent 是描述應用想要做什么。 Intent 數據結構兩
個最重要的部分是動作和動作對應的數據。典型的動作類型有 :MAIN (活動的門戶)、 VIEW 、 PICK 、 EDIT
等。而動作對應的數據則以 URI 的形式進行表示。例如 : 要查看某個人的聯系方式,你需要創建一個動作類
型為 VIEW 的 Intent ,以及一個表示這個人的 URI 。
Android 使用了 Intent 這個特殊類,實現在屏幕與屏幕之間移動。 Intent 類用于描述一個應用將會做什 么
事。在 Intent 的描述結構中,有兩個最重要的部分:動作和動作對應的數據。典型的動作類型有: MAIN ( a ctivity
的門戶)、 VIEW 、 PICK 、 EDIT 等。而動作對應的數據則以 URI 的形式進行表示。例如:要查看一個人的 聯
系方式,你需要創建一個動作類型為 VIEW 的 intent ,以及一個表示這個人的 URI 。
與之有關系的一個類叫 IntentFilter 。相對于 intent 是一個有效的做某事的請求,一個 intentfilter 則用于 描
述一個 activity (或者 IntentReceiver )能夠操作哪些 intent 。一個 activity 如果要顯示一個人的聯系方式時, 需
要聲明一個 IntentFilter ,這個 IntentFilter 要知道怎么去處理 VIEW 動作和表示一個人的 URI 。 IntentFilter 需
要在 AndroidManifest.xml 中定義。
通過解析各種 intent ,從一個屏幕導航到另一個屏幕是很簡單的。當向前導航時, activity 將會調用
startActivity(IntentmyIntent) 方法。然后,系統會在所有安裝的應用程序中定義的 IntentFilter 中查找,找到最
匹配 myIntent 的 Intent 對應的 activity 。新的 activity 接收到 myIntent 的通知后,開始運行。當 startActivity 方
法被調用將觸發解析 myIntent 的動作,這個機制提供了兩個關鍵好處:
A 、 Activities 能夠重復利用從其它組件中以 Intent 的形式產生的一個請求;
B 、 Activities 可以在任何時候被一個具有相同 IntentFilter 的新的 Activity 取代。
IntentReceiver:
當你希望你的應用能夠對一個外部的事件 ( 如當電話呼入時,或者數據網絡可用時,或者到了晚上時 ) 做出響
應,你可以使用一個 IntentReceiver 。雖然 IntentReceiver 在感興趣的事件發生時,會使用 NotificationManage r
通知用戶,但它并不能生成一個 UI 。 IntentReceiver 在 AndroidManifest.xml 中注冊,但也可以在代碼中使用
Context.registerReceiver() 進行注冊。當一個 intentreceiver 被觸發時,你的應用不必對請求調用 inten treceiver ,
系統會在需要的時候啟動你的應用。各種應用還可以通過使用 Context.broadcastIntent() 將它們自己的
intentreceiver 廣播給其它應用程序。
Service
一個 Service 是一段長生命周期的,沒有用戶界面的程序。比較好的一個例子就是一個正在從播放列表中
播放歌曲的媒體播放器。在一個媒體播放器的應用中,應該會有多個 activity ,讓使用者可以選擇歌曲并播 放
歌曲。然而,音樂重放這個功能并沒有對應的 activity ,因為使用者當然會認為在導航到其它屏幕時音樂應 該
還在播放的。在這個例子中,媒體播放器這個 activity 會使用 Context.startService() 來啟動一個 service ,從而
可以在后臺保持音樂的播放。同時,系統也將保持這個 service 一直執行,直到這個 service 運行結束。另外 ,
我們還可以通過使用 Context.bindService() 方法,連接到一個 service 上(如果這個 service 還沒有運行將啟動
它)。當連接到一個 service 之后,我們還可以 service 提供的接口與它進行通訊。拿媒體播放器這個例子來 說 ,
我們還可以進行暫停、重播等操作。
Content Provider:
Android 應用程序能夠將它們的數據保存到文件、 SQLite 數據庫中,甚至是任何有效的設備中。當你想
將你的應用數據與其它的應用共享時,內容提供器就可以發揮作用了。因為內容提供器類實現了一組標準 的
方法,從而能夠讓其它的應用保存或讀取此內容提供器處理的各種數據類型。
數據是應用的核心。在 Android 中,默認使用鼎鼎大名的 SQLite 作為系統 DB 。但是在 Android 中,使用方
法有點小小的不一樣。在 Android 中每一個應用都運行在各自的進程中,當你的應用需要訪問其他應用的數
據時,也就需要數據在不同的虛擬機之間傳遞,這樣的情況操作起來可能有些困難 ( 正常情況下,你不能讀 取
其他的應用的 db 文件 ) , ContentProvider 正是用來解決在不同的應用包之間共享數據的工具。
? 所有被一個 Android 應用程序創建的偏好設置,文件和數據庫都是私有的。
? 為了和其他應用程序共享數據,應用程序不得不創建一個 Content Provider
? 要回索其他應用程序的數據,它自己的 Content Provider 必須被調用
? Android 本地 Content Provider 包括:
? CallLog :地址和接收到的電話信息
? Contact.People.Phones :存儲電話號碼
? Setting.System :系統設置和偏好設置
? 等等
活動是最基本的 Android 應用程序組件,應用程序中,一個活動通常就是一個單獨的屏幕。每一個活動
都被實現為一個獨立的類,并且從活動基類中繼承而來,活動類將會顯示由視圖控件組成的用戶接口,并 對
事件做出響應。大多數的應用是由多個屏幕顯示組成。例如 : 一個文本信息的應用也許有一個顯示發送消息 的
聯系人列表屏幕,第二個屏幕用來寫文本消息和選擇收件人,再來一個屏幕查看消息歷史或者消息設置操 作
等。這里每一個這樣的屏幕就是一個活動,很容易實現從一個屏幕到一個新的屏幕并且完成新的活動。在 某
些情況下當前的屏幕也許需要向上一個屏 幕活動提供返回值 -- 比如讓用戶從手機中挑選一張照片返回通訊錄
做為電話撥入者的頭像。
當一個新的屏幕打開后,前一個屏幕將會暫停,并保存在歷史堆棧中。用戶可以返回到歷史堆棧中的 前
一個屏幕。當屏幕不再使用時,還可以從歷史堆棧中刪除。默認情況下, Android 將會保留從主屏幕到每一
個應用的運行屏幕。
簡單理解 Activity 代表一個用戶所能看到的屏幕, Activity 主要是處理一個應用的整體性工作,例如, 監
聽系統事件 ( 按鍵事件、觸摸屏事件等 ) 、為用戶顯示指定的 View ,啟動其他 Activity 等。所有應用的 Activit y
都繼承于 android.app.Activity 類,該類是 Android 提供的基層類,其他的 Activity 繼承該父類后,通過 Over ride
父類的方法來實現各種功能,這種設計在其他領域也較為常見。
Intent:
調用 Android 專有類 Intent 進行架構屏幕之間的切換。 Intent 是描述應用想要做什么。 Intent 數據結構兩
個最重要的部分是動作和動作對應的數據。典型的動作類型有 :MAIN (活動的門戶)、 VIEW 、 PICK 、 EDIT
等。而動作對應的數據則以 URI 的形式進行表示。例如 : 要查看某個人的聯系方式,你需要創建一個動作類
型為 VIEW 的 Intent ,以及一個表示這個人的 URI 。
Android 使用了 Intent 這個特殊類,實現在屏幕與屏幕之間移動。 Intent 類用于描述一個應用將會做什 么
事。在 Intent 的描述結構中,有兩個最重要的部分:動作和動作對應的數據。典型的動作類型有: MAIN ( a ctivity
的門戶)、 VIEW 、 PICK 、 EDIT 等。而動作對應的數據則以 URI 的形式進行表示。例如:要查看一個人的 聯
系方式,你需要創建一個動作類型為 VIEW 的 intent ,以及一個表示這個人的 URI 。
與之有關系的一個類叫 IntentFilter 。相對于 intent 是一個有效的做某事的請求,一個 intentfilter 則用于 描
述一個 activity (或者 IntentReceiver )能夠操作哪些 intent 。一個 activity 如果要顯示一個人的聯系方式時, 需
要聲明一個 IntentFilter ,這個 IntentFilter 要知道怎么去處理 VIEW 動作和表示一個人的 URI 。 IntentFilter 需
要在 AndroidManifest.xml 中定義。
通過解析各種 intent ,從一個屏幕導航到另一個屏幕是很簡單的。當向前導航時, activity 將會調用
startActivity(IntentmyIntent) 方法。然后,系統會在所有安裝的應用程序中定義的 IntentFilter 中查找,找到最
匹配 myIntent 的 Intent 對應的 activity 。新的 activity 接收到 myIntent 的通知后,開始運行。當 startActivity 方
法被調用將觸發解析 myIntent 的動作,這個機制提供了兩個關鍵好處:
A 、 Activities 能夠重復利用從其它組件中以 Intent 的形式產生的一個請求;
B 、 Activities 可以在任何時候被一個具有相同 IntentFilter 的新的 Activity 取代。
IntentReceiver:
當你希望你的應用能夠對一個外部的事件 ( 如當電話呼入時,或者數據網絡可用時,或者到了晚上時 ) 做出響
應,你可以使用一個 IntentReceiver 。雖然 IntentReceiver 在感興趣的事件發生時,會使用 NotificationManage r
通知用戶,但它并不能生成一個 UI 。 IntentReceiver 在 AndroidManifest.xml 中注冊,但也可以在代碼中使用
Context.registerReceiver() 進行注冊。當一個 intentreceiver 被觸發時,你的應用不必對請求調用 inten treceiver ,
系統會在需要的時候啟動你的應用。各種應用還可以通過使用 Context.broadcastIntent() 將它們自己的
intentreceiver 廣播給其它應用程序。
Service
一個 Service 是一段長生命周期的,沒有用戶界面的程序。比較好的一個例子就是一個正在從播放列表中
播放歌曲的媒體播放器。在一個媒體播放器的應用中,應該會有多個 activity ,讓使用者可以選擇歌曲并播 放
歌曲。然而,音樂重放這個功能并沒有對應的 activity ,因為使用者當然會認為在導航到其它屏幕時音樂應 該
還在播放的。在這個例子中,媒體播放器這個 activity 會使用 Context.startService() 來啟動一個 service ,從而
可以在后臺保持音樂的播放。同時,系統也將保持這個 service 一直執行,直到這個 service 運行結束。另外 ,
我們還可以通過使用 Context.bindService() 方法,連接到一個 service 上(如果這個 service 還沒有運行將啟動
它)。當連接到一個 service 之后,我們還可以 service 提供的接口與它進行通訊。拿媒體播放器這個例子來 說 ,
我們還可以進行暫停、重播等操作。
Content Provider:
Android 應用程序能夠將它們的數據保存到文件、 SQLite 數據庫中,甚至是任何有效的設備中。當你想
將你的應用數據與其它的應用共享時,內容提供器就可以發揮作用了。因為內容提供器類實現了一組標準 的
方法,從而能夠讓其它的應用保存或讀取此內容提供器處理的各種數據類型。
數據是應用的核心。在 Android 中,默認使用鼎鼎大名的 SQLite 作為系統 DB 。但是在 Android 中,使用方
法有點小小的不一樣。在 Android 中每一個應用都運行在各自的進程中,當你的應用需要訪問其他應用的數
據時,也就需要數據在不同的虛擬機之間傳遞,這樣的情況操作起來可能有些困難 ( 正常情況下,你不能讀 取
其他的應用的 db 文件 ) , ContentProvider 正是用來解決在不同的應用包之間共享數據的工具。
? 所有被一個 Android 應用程序創建的偏好設置,文件和數據庫都是私有的。
? 為了和其他應用程序共享數據,應用程序不得不創建一個 Content Provider
? 要回索其他應用程序的數據,它自己的 Content Provider 必須被調用
? Android 本地 Content Provider 包括:
? CallLog :地址和接收到的電話信息
? Contact.People.Phones :存儲電話號碼
? Setting.System :系統設置和偏好設置
? 等等