Android 教學
新版 Android SDK 下載安裝中文教學課程講義,歡迎延伸點閱!
我們的《Android 手機應用程式開發教學課程免費講義》網路讀者俱樂部會員(請點選此連結),歡迎您的加入,謝謝!
【孫傳雄研究室 編著】當您閱讀完我們在台灣時間 2011年3月22日所發表的 Android 教學講義第八講上篇之後,是否對於 Android 的應用程式組件 ( Application Components ) 與意圖元件 ( Intent ) 有更進一步地暸解呢?
假若,您尚未閱讀過我們的 Android 教學課程講義,為求您在 Android 學習上的完整性,煩請您先閱讀完第一講至第八講上篇之後,再來閱讀第八講中篇 (1) 的講義:
本講義目前網路連載發表有:Android手機程式開發教學講義懶人包、Android 教學講義第一講、Android 教學講義第二講、Android 教學講義第三講、Android 教學講義第四講、Android 教學講義第五講、Android 教學講義第六講、Android 教學講義第七講上篇、Android 教學講義第七講下篇、Android 2.3補充教材1、Android 2.3補充教材2、Android 3.0平板電腦完整功能搶先看(From T-Mobile)、Android 3.0 平板電腦應用程式開發:第一講、Android 3.0 SDK 正式版登場、Android 嵌入式系統最新開發應用 - SAAB IQon 車用電腦、Android 2.3 補充教材3、Android 3.0 平板電腦應用程式開發:第二講、Android 教學講義第八講上篇、Android 教學講義第八講中篇(1)、Android 4.0 SDK 開發功能介紹與下載網址、 Android 4.0 SDK 下載安裝完整教學、 Android 4.0 模擬器安裝設定教學課程講義、Android 4.0 的 Holo theme 佈景主題介紹與設定教學課程講義
我們將在此篇 Android 教學講義第八講中篇 (1) 之中,介紹以下七項主題:
- Android 教學:關於 Android 的應用程式組件 ( Application Components ) 的補充
- Android 教學:處理程序 ( Process ) 與執行緒 ( Thread )
- Android 教學:空白處理程序 ( Empty Process )
- Android 教學:背景處理程序 ( Background Process )
- Android 教學:Service 處理程序 ( Service process )
- Android 教學:可視處理程序 ( Visible Process )
- Android 教學:前景處理程序 ( Foreground process )
Android 教學:關於 Android 的應用程式組件 ( Application Components ) 的補充
當您閱讀至本篇講義前,可能先會有個疑問:『運用 Android 應用程式組件的好處在哪兒呢?』
我們歸納成以下兩點說明:
- 其一,它省卻了 Android 手機應用程式開發者撰寫這些基礎程式碼的時間與精力。
- 其二,它建立了 Android 手機應用程式開發的標準規範,讓開發者能夠依循此標準規範進行程式開發的編寫設計工作。
倘若您是資訊相關學域背景的讀者朋友應該知道,此觀念即為軟體工程學當中常講的組件式軟體工程 ( Component-Based Software Engineering, CBSE )。
更進一步地說,由於,這五大應用程式組件已被 Android 封裝成各自不同的 Java 類別 ( Class ),因此, Android 手機應用程式開發者可以在程式碼當中直接繼承它們的屬性與方法,依循 Andorid 官方的規則,進而快速地建構出他們所想要的 Android 手機應用程式之根基。
比如,本講義的 ” Converter 應用程式 ” 教學範例便是繼承了該五大應用程式組件當中的 Activity 應用程式組件(如下圖箭頭處所示)。
在此要請您特別注意地是,這五大應用程式組件不需要同時並存。您可以依應用程式開發需求來相互搭配運用。
另外,我們也要強調地是,即使您在 Android 手機應用程式繼承了這五大應用程式組件,也不代表您的 Android 手機應用程式開發就此大功告成。
它只是一個 Android 制定好的基礎規範,您仍必需在此規範之下,鑽鑿出屬於您自己的 Android 手機應用程式。
說到這兒,熟悉Java程式語言的您或許會問:『這五大應用程式組件都只是功能面的區分而已,憑什麼能取代傳統 Java 應用程式碼的單一啟始點 main() 方法呢?』
Android 教學:處理程序 ( Process ) 與執行緒 ( Thread )
回答此問題,我們必需先從 Android 作業系統的處理程序 ( Process ) 談起。(註: Process 也常被翻譯成行程或者進程)
什麼是處理程序呢?
假若,您的個人電腦是使用 Microsoft Windows 系列之作業系統的話,應該都知道它有一個名為” Windows 工作管理員”的工具程式。
講到此,您可能會先問我們:『 Windows 工作管理員是管理什麼工作呢?跟處理程序 ( Process ) 又有何關係呢?』
其實,Windows 工作管理員跟處理程序大有關係!
由於,在 Windows 作業系統當中正在執行的應用程式即稱之為工作 ( Task ) 。因此, Windows 工作管理員的目的即在管理Windows作業系統當中所有正在執行的應用程式。
所以,您會在 ” Windows 工作管理員” 當中看見您各項應用程式正在執行的工作狀態。並且,您也可以在此工具程式中啟動與結束某個應用程式的執行工作。(如下圖所示)
更重要地是,您還可以看到在您的 Windows 作業系統當中的處理程序。以及它們所佔用的 CPU 使用率與實體記憶體空間等資訊欄位。(如下圖所示)
這些處理程序所代表的意義,便是所有正在執行的應用程式(即工作)實際在電腦系統硬體之中佔用的實體單元。
另外,這些實體單元即為處理程序所佔用的 CPU 使用時間 ( CPU Time ) 以及主記憶體的內部儲存空間等系統資源。
更進一步地說,每一個 Windowos 應用程式至少包括了一個以上的處理程序。並且每一個處理程序之下通常會再細分出多個執行緒 ( Thread ) 。
雖然,這些執行緒分別肩負了處理程序所指派調度的分支任務。不過,它並不像每個處理程序一樣擁有各自的系統資源,而是共同分享它們所屬處理程序之中的系統資源。
相對於 Windows 作業系統的應用程式來說, Android 手機作業系統的應用程式在執行時,同樣以工作管理的概念來運行。(如下圖所示)
每一個 Android 手機應用程式不只可以擁有單一個處理程序,它更可以擁有多個處理程序。
同時,不同的 Android 手機應用程式之間,還可以共同分享多個處理程序。
由於, Android 為了有更好的使用者體驗 ( User Experience ) ,所以,只要在系統資源充裕的狀況下,它可以讓手機用戶不用關閉應用程式,便能夠在不同的應用程式之間輕鬆地進行切換的動作。
更進一步地說,當手機用戶離開 ( Leave ) 一個應用程式切換至新的應用程式時,即使它已完全沒有進行任何的執行動作 ( Running ) ,它的處理程序仍可以保持在 Android 的系統後端默默地存在。
此舉讓手機用戶需要原來的應用程式時,能夠很快速地重新回復它。
然而,依上述所言, Android 智慧型手機的 CPU 使用時間 ( CPU Time ) 以及主記憶體的內部儲存空間是有限的。
所以,當系統資源不敷使用時, Android 作業系統會依照處理程序的重要性,來取決那一個處理程序可以優先從系統資源之中消滅殆盡( Kill )。
關於處理程序被 Android 作業系統消滅的優先順序,我們依 Android Developers 官網的說明,由低至高的順位歸納匯整如下所示(資料來源: Android Developers 官網)。
Android 教學:空白處理程序 ( Empty Process )
- 空白處理程序 ( Empty Process ) :空白處理程序 ( Empty Process ) 意指沒有包含任何有效的應用程式組件之處理程序。
即然它是空白的,為何還會在 Android 作業系統當中存在呢?
因為,該處理程序主要是做為應用程式組件的快取 ( Cache ) 角色。
更進一步地說,當應用程式組件有需求時,可以隨時取用它來執行。因此,該應用程式組件的啟動時間得以有效縮短。此即為快取之作用。
也因為, Android 作業系統視這類做為快取角色的處理程序之重要性為最低。所以,當系統資源不敷使用時,這種空白處理程序 ( Empty Process ) 為最常被 Android 作業系統優先消滅的處理程序。
Android 教學:背景處理程序 ( Background Process )
- 背景處理程序 ( Background Process ) :背景處理程序 ( Background Process ) 是指當下無法讓手機用戶看得見使用者介面的 Activity 應用程式組件之處理程序。
更進一步地說,當某個 Activity 應用程式組件正在執行時,若有另一個新的 Activity 應用程式組件被啟動,並且它的使用者介面完全覆蓋了原本的那個 Activity 應用程式組件之使用者介面後。
則 Android 作業系統會強置性呼叫 Activity 應用程式組件的 onStop() 方法,以便將該 Activity 應用程式組件之處理程序更動為停止 ( Stop ) 狀態。
此時,該 Activity 應用程式組件之處理程序並沒有被 Android 作業系統消滅殆盡,它是處於停止的狀態。手機用戶仍可以重新啟動 ( Restart ) 這個 Activity 應用程式組件的處理程序。
不過,由於手機畫面的焦點已完全是新的 Activity 應用程式組件之使用者介面,使用者當下無法看見原有的使用者介面,因此, Android 作業系統會視這種背景處理程序 ( Background Process ) 的重要性比較低。
當系統資源不敷使用時,它為次常被 Android 作業系統優先消滅的處理程序。
另外,當 Android 作業系統當中累積了許多這類背景處理程序 ( Background Process ) 時,它則會採取常用於處理快取記憶體 ( Cache ) 緩衝區的最近最少使用 ( Least Recently Used, LRU ) 演算法,將最近最少使用的背景處理程序 ( Background Process ) 優先消滅。
Android 作業系統在此使用最近最少使用 ( Least Recently Used, LRU ) 演算法的目的,是要避免手機用戶最近時常用到的那個背景處理程序 ( Background Process ) ,不致於在這一堆背景處理程序 ( Background Process ) 之中,優先被消滅。
Android 教學:Service 處理程序 ( Service process )
- Service 處理程序 ( Service process ) : Service 處理程序 ( Service process ) 意指正被啟動執行的 Service 應用程式組件所產生之處理程序(即 Service 的 startService() 方法已被呼叫)。
Service 處理程序跟背景處理程序一樣都是默默地位居 Android 作業系統的後端。亦即它們本身不會有任何使用者介面 ( User Interface , UI ) 出現在手機畫面之前。手機用戶在視覺上也不會察覺它的存在。
不過,因為 Service 處理程序 ( Service process ) 是由正被啟動執行的 Service 應用程式組件而產生,所以,它仍處於後端持續運轉的階段,並非像背景處理程序 ( Background Process ) 已是停止的狀態。
亦因如此,它的重要性遠比背景處理程序 ( Background Process ) 還高。
更進一步地說,雖然,這些 Service 應用程式組件並不具備使用者介面,但是,它們大多肩負了執行時間較長的應用程式功能(註:例如網路資料下載、MP3音樂背景播放等…)。
因此,當系統資源不敷使用時,它所產生的處理程序會次於背景處理程序,成為被 Android 作業系統考量消滅的第三順位。
Android 教學:可視處理程序 ( Visible Process )
- 可視處理程序 ( Visible Process ) :上述三種處理程序有一個共通的性質:它們皆處於 Android 作業系統的後端且當下不具備使用者介面之狀態。
因此,手機用戶在視覺上並不會明顯感受到它們的存在。相對而言, Android 作業系統也視它們為重要性較低的處理程序。
聰明的您,一定會舉一反三說:『依此論點推之,假若某個處理程序處於 Android 作業系統的前端且當下具備使用者介面之狀態,它的重要性應該比較高。』
嘿,您答對了!
不過, Android 作業系統依其重要性再向下細分成可視處理程序 ( Visible Process ) 與前景處理程序 ( Foreground Process ) 兩種處理程序。
談此之前,我們先給大家看看本研究室的一個教學範例。(註:此教學範例目前只是用來說明可視處理程序 ( Visible Process ) 與前景處理程序 ( Foreground Process ) 兩種處理程序的不同。至於,該範例的實作教學,礙於範幅之故,我們會找機會再跟大家分享。)
我們在此教學範例之中,設計了一個具有三個 Activity 應用程式組件的 Android 手機應用程式,它分別包括了 Activity1 、 Activity2與 Activity3 等三個 Activity 應用程式組件。
這三個 Activity 應用程式組件皆分別各自擁有使用者介面。
Activity1 應用程式組件則為最初啟始的應用程式組件。
在 Activity1 應用程式組件的使用者介面當中,我們放置了開啟 Activity2 應用程式組件的按鈕 (即 Activity 2 Strat 按鈕) 與開啟 Activity3 應用程式組件的按鈕 (即 Activity3 Start 按鈕)。(如下圖所示)
當手機用戶在 Activity1 應用程式組件的使用者介面之中,按下了開啟 Activity2 應用程式組件的按鈕時,它會直接開啟 Activity2 應用程式組件。
請注意!此舉並沒有將 Activity1 應用程式組件消滅 ( Destroy ) ,Activity1 應用程式組件當下只是被 Activity2 應用程式組件的使用者介面完全覆蓋而已。(如下圖所示)
另一方面,當手機用戶在 Activity1 應用程式組件的使用者介面之中,按下了開啟 Activity3 應用程式組件的按鈕時,它一樣會直接開啟 Activity3 應用程式組件。
同樣的是,我們並沒有將 Activity1 應用程式組件消滅 ( Destroy ) 。
不同的是,由於,我們將 Activity3 應用程式組件的使用者介面已設定成對話視窗 ( Dialog ) 的型態。所以 Activity1 應用程式組件的使用者介面並不會被 Activity3 應用程式組件的使用者介面完全覆蓋,而是部份覆蓋而已。
雖然, Activity1 應用程式組件的使用者介面並沒有被 Activity3 應用程式組件的使用者介面完全覆蓋,但是手機用戶仍無法在畫面之中操作 Activity1 應用程式組件的使用者介面。因為,手機畫面的焦點已落在 Activity3 應用程式組件的對話視窗介面之上了。(如下圖所示)
我們會舉這個教學範例,主要是為了解釋這些應用程式組件在以下所產生的三種處理程序狀態:
當 Activity2 應用程式組件的使用者介面完全覆蓋於 Activity1 應用程式組件的使用者介面時, Activity2 應用程式組件所產生的處理程序為前景處理程序 ( Foreground process )。
至於, Activity1 應用程式組件所產生的處理程序則為背景處理程序 ( Background Process ) 。
當 Activity3 應用程式組件的使用者介面部份覆蓋於 Activity1 應用程式組件的使用者介面時, Activity3 應用程式組件所產生的處理程序仍為前景處理程序 ( Foreground process )。
至於, Activity1 應用程式組件所產生的處理程序,此時則為可視處理程序 ( Visible Process ) 。
在此,我們希望您暸解的是:當某個 Activity 應用程式組件的使用者介面被另一個 Activity 應用程式組件部份覆蓋時,其所產生的處理程序即為可視處理程序 ( Visible Process ) 。
相對於使用者介面被完全覆蓋的狀態而言, Android 視這類使用者介面被部份覆蓋的處理程序,仍為極重要且需持續存在的處理程序。
因此,在系統資源不足的狀態之下,它是低於前景處理程序 ( Foreground process )順位,亦即最後倒數第二個被 Android 作業系統消滅的對象。
另外,當 Service 應用程式組件結合 Activity 應用程式組件時,只要該 Activity 應用程式組件的使用者介面沒有被其它的使用者介面完全覆蓋,則其所產生的處理程序亦屬於可視處理程序 ( Visible Process ) 的範疇。
Android 教學:前景處理程序 ( Foreground process )
- 前景處理程序 ( Foreground process ) :當系統資源不足的狀態之下, Android 作業系統最後逼不得已才消滅的對象,就是前景處理程序。
什麼是前景處理程序 ( Foreground process ) 呢?
簡單地說就是:手機用戶正在畫面當中使用的 Activity 應用程式組件所產生之處理程序。
因為,它的使用者介面正被手機用戶所使用,所以,它遠比其它的處理程序還重要。
當然,假若 Service 應用程式組件所結合的那個 Activity 應用程式組件,正好也處於手機用戶正在畫面當中使用的狀態,則其所產生的處理程序亦屬於前景處理程序 ( Foreground process ) 的範疇。
更進一步地說, Service 應用程式組件在結合 Activity 應用程式組件的狀態之下,其所產生的處理程序其實被視為 Activity 應用程式組件所產生的處理程序。所以, Android 作業系統會視上述的狀況為前景處理程序 ( Foreground process ) 的範疇
另外,假若 BroadcastReceiver 應用程式組件正在接收系統訊息時,則其所產生的處理程序同樣也屬於前景處理程序 ( Foreground process ) 的範疇。
在此要請您特別注意的是,假如有一個重要性較低的處理程序結合於另一個重要性較高的處理程序,則 Android 作業系統會以重要性較高的處理程序之等級,看待於重要性較低的處理程序。亦即重要性較低的處理程序能夠自動升等。
另外,有一點還要提醒比較進階的讀者朋友們,由於, Service 處理程序 ( Service process ) 之重要性,遠高於同樣處於系統後端的背景處理程序 ( Background Process ) 。
因此,如果您的 Android 手機應用程式有執行時間超過五秒之功能,則強烈建議您不要只單純地在 Activity 應用程式組件之中,為主執行緒 ( Main Thread ) 新增另一條新的執行緒去處理這個功能。
因為,如果該 Activity 應用程式組件所產生的處理程序不小心落入背景處理程序 ( Background Process ) 的順位,則其就易於被 Android 作業系統所消滅。
所以,您需要將此條新的執行緒放置到 Service 應用程式組件的方式去運作。以確保 Activity 應用程式組件所產生的處理程序不小心落入背景處理程序 ( Background Process ) 的順位而被 Android 作業系統所消滅時,該工作仍會一直在Service 處理程序 ( Service process ) 之中運行。(註:上述這段屬進階內容,入門學習者可以先略過不看。)
此文未完,待續。
喜歡閱讀我們的講義嗎?歡迎加入我們所成立的《Android 手機程式開發教學課程免費講義》網路讀者俱樂部會員(請點選此連結),謝謝!
如果您對於 Android 手機與平板電腦應用程式開發有興趣,歡迎閱讀我們在網路上發表的 Android 手機與平板電腦應用程式開發教學系列講義:
本講義目前網路連載發表有:Android手機程式開發教學講義懶人包、Android 教學講義第一講、Android 教學講義第二講、Android 教學講義第三講、Android 教學講義第四講、Android 教學講義第五講、Android 教學講義第六講、Android 教學講義第七講上篇、Android 教學講義第七講下篇、Android 2.3補充教材1、Android 2.3補充教材2、Android 3.0平板電腦完整功能搶先看(From T-Mobile)、Android 3.0 平板電腦應用程式開發:第一講、Android 3.0 SDK 正式版登場、Android 嵌入式系統最新開發應用 - SAAB IQon 車用電腦、Android 2.3 補充教材3、Android 3.0 平板電腦應用程式開發:第二講、Android 教學講義第八講上篇、Android 教學講義第八講中篇(1)、Android 4.0 SDK 開發功能介紹與下載網址、 Android 4.0 SDK 下載安裝完整教學、 Android 4.0 模擬器安裝設定教學課程講義、Android 4.0 的 Holo theme 佈景主題介紹與設定教學課程講義
此篇講義的主要參考文獻來源:Android Developers 官網
著作權聲明
本講義之內文、排版等著作權或其他智慧財產權歸屬 孫傳雄 與 孫傳雄研究室 所有,非經書面同意禁止任何形式之翻印、全文轉貼或者授課使用行為。但例外允許在網際網路上引用此講義之網址連結。
本講義之內文所提及或者引用的公司名稱、產品名稱以及所引用的文字、商標、Youtube短片、產品相片或者網站頁面,均為其所屬公司所擁有,特以聲明。