• 1. 第6章 活動(Activity)及意圖(Intent)Android 4.x 應用程式開發之鑰 王安邦
  • 2. 目錄6-1 活動(Activity) 6-1-1 活動堆疊(Activity Stack)或返回堆疊(back stack) 6-1-2 創建一個活動(Creating an Activity) 6-1-3 實作使用者界面(Implementing a user interface) 6-1-4 在清單檔中宣告所含的活動(Declaring the activity in the manifest) 6-1-5 啟動活動(Starting an Activity) 6-1-6 關閉一個活動(Shutting Down an Activity) 6-2 啟動另一活動未夾帶資料 6-3 啟動另一活動且夾帶資料 6-4 啟動另一活動並由該活動傳回資料 6-5 執行特定工作的活動 6-6 意圖篩選器(Intent Filter) 6-7 管理活動的生命週期(Managing the Activity Lifecycle) 6-7-1 活動的生命週期 6-7-2 實作生命週期的回呼方法(Implementing the lifecycle callbacks) 6-7-3 儲存活動狀態(Saving activity state) 6-7-4 處理組態變化(Handling configuration changes) 6-7-5 協調活動(Coordinating activities) Android 4.x 應用程式開發之鑰 王安邦
  • 3. 1. 活動(Activity)一個活動(Activity)是一個應用程式元件,提供一螢幕給使用者去作某些事,諸如,打電話、照相、寄送郵件、觀看地圖。每一活動被賦予一個視窗在上面繪製使用者介面,該視窗典型會佔用整個螢幕,但也可能是較小的及浮動到另一視窗的頂端。 每個活動都有一個生命週期,在一應用程式或任務中的其他活動是彼此獨立的,每個活動都獨立的被啟動(開始),使用者或系統可以啟動、執行、暫停、恢復、停止和重新啟動一個活動,由於這種獨立性,活動可以多種方式重新使用而且可被其他活動取代。Android 4.x 應用程式開發之鑰 王安邦
  • 4. 1-1 活動堆疊(Activity Stack)或返回堆疊(back stack)一個應用程式一般是由多個彼此相連的活動所組成,典型地,在一個應用程式中的一個活動會被指示為”主要”(main)活動,它在應用程式第一次被啟動時會呈現給使用者看到,然後,由此活動再啟動其他的活動,以執行其他動作。使用者在執行一個應用程式時,所執行過的活動,Android系統會把這些活動存在一個線性堆疊(stack),稱為活動堆疊(Activity Stack)或返回堆疊(back stack),返回堆疊採用”後進先出”(last in, first out)原則,每次當一新活動啟動,其前個活動就會被停止,系統把該活動推入返回堆疊中,且使用者取得焦點,因此,當使用者完成目前的活動,並按返回(BACK)鍵時,剛被推入的活動就會被彈出(Pop)並恢復(Resume)執行。 當一活動由於另一活動啟動而被停止時,這種狀態的改變會透過活動生命週期的回呼方法(callback mehtod)來告知。由於狀態的改變,一個活動會接收到多種的回呼方法(callback mehtod),這些狀態的改變,包括,系統建立(Create)該活動、停止(Stop)該活動、恢復(Resume)該活動、銷毀(Destroy)該活動。Android 4.x 應用程式開發之鑰 王安邦
  • 5. 1-2 創建一個活動(Creating an Activity)要創建一個活動,你必須建立一個Activity的子類別(或該類別的現存子類別)。在您的子類別中,您必須去實作各種回呼方法(callback methods),以便活動改變狀態時(例如,活動被建立、停止、恢復、銷毀),系統可對應地呼叫執行。 兩個最重要的回呼方法: onCreate() 您必須實作此方法,因為當系統為您建立活動時需要呼叫它,在您的實作您活動時,必須啟動的基本元件,最重要的是在此方法必須呼叫setContentView()去定義活動所需的使用者介面。   onPause() 當使用者離開您的活動時(這並非意味著活動已被銷毀),系統將會呼叫此方法。通常在此刻您必須對變動作一總結處理,因為,使用者也許不會再返回。Android 4.x 應用程式開發之鑰 王安邦
  • 6. 1-4 在清單檔中宣告所含的活動(Declaring the activity in the manifest)為了系統能夠存取您的活動,這些活動必須被宣告在清單檔(manifest file)中,宣告活動的方式是在清單檔中的元素中加入元素。一活動可以在元素中利用(意圖篩選器)元素,去宣告其他應用程式元件要如何啟動此活動。Android 4.x 應用程式開發之鑰 王安邦
  • 7. 1-5 啟動活動(Starting an Activity)-1在Android系統中一個活動要啟動另一活動主要是透過意圖(intent),一個意圖主要包含下三個資訊: Action(動作):指定被啟動的活動要執行的動作。主要的動作以常數表示如下: ACTION_CALL:撥打電話。 ACTION_VIEW:檢視檔案或網頁。 ACTION_EDIT:編輯檔案。 ACTION_MAIN:活動啟動任務的初始活動,沒有資料的輸入,並沒有返回的輸出。 ACTION_SYNC:活動用以使移動設備上的的資料與在伺服器上的資料同步。 Data(資料): 包含要被處理的資料URI(Universal Resource Indicator)及資料類型(MIME type),不同的動作搭配不同類型的資料規格。例如,如果動作是ACTION_EDIT,資料欄應包含要編輯檔案的URI。 Category(目錄): 是一個字串用以說明處理意圖的活動種類,一個意圖物件內可指定任何數目的目錄(Category)。Android 4.x 應用程式開發之鑰 王安邦
  • 8. 1-5 啟動活動(Starting an Activity)-2要啟動一個活動有下列3種方法: 以明示意圖(explicit intent)方式啟動一活動:您可以藉著呼叫startActivity()方法明示地去啟動另一活動,並傳遞一個意圖(intent)說明您要啟動的活動。當您要啟動一個新活動時,可能需要傳送資料給它,這時可透過Bundle物件,夾帶資料,Bundle物件是採key-value對的方式儲存資料。 啟動一個要求結果的活動(Starting an activity for a result):當需要從啟動的活動接收一個結果,在這種情況下,可藉著呼叫startActivityForResult()來啟用該活動(而不是使用startActivity())。 以暗示意圖(implicit intent)方式啟動一活動:只指明所需執行的動作及附帶的資料,並沒有明指那一個活動,而由系統根據指定的動作及資料,到目前已經安裝的應程式中,去尋找看是否有配對成功的活動,若找到則加予執行,若有多個活動滿足條件,則多個活動會同時顯現,供使用者挑選執行。Android 4.x 應用程式開發之鑰 王安邦
  • 9. 1-6 關閉一個活動(Shutting Down an Activity)您可以利用finish()方法來關閉活動。您也可以呼叫finishActivity()關閉您之前啟動的單獨活動。在大多數情況下,你不應該使用這些方法明確地關閉活動。因為Android系統會為您管理活動的生命週期,所以你不需要關閉你自己的活動。Android 4.x 應用程式開發之鑰 王安邦
  • 10. 2.啟動另一活動未夾帶資料-1本例含下列兩個活動: Ch06startActWoBundle活動:顯示下圖左的畫面,讓使用者輸入姓名及性別(male或female),輸入完,按 確定 鈕,接著以startActivity()方法呼叫另一LogSuccAct活動(且沒傳送資料給此活動),顯示登入成功的畫面。 LogSuccAct活動:顯示登入成功的畫面,如下圖右。Android 4.x 應用程式開發之鑰 王安邦Ch06startActWoBundle活動畫面LogSuccAct活動畫面
  • 11. 2.啟動另一活動未夾帶資料-2建立一個Android專案。 Project Name:Ch06startActWoBundle Build Target:Android 4.0(API 14) Application:Ch06呼叫活動未帶資料 Package Name:andbas.Ch06startActWoBundle Create Activity:要勾選,並輸入活動名稱Ch06startActWoBundle。 Minimum SDK:15。 系統已經幫忙建立了Ch06startActWoBundle的活動及AndroidManifest.xml檔,下面將修改Ch06startActWoBundle,新增所要的功能。 strings.xml檔的內容如下:Android 4.x 應用程式開發之鑰 王安邦
  • 12. 2.啟動另一活動未夾帶資料-3有兩個活動的畫面配置檔:main.xml(主活動)及logsucc.xml(LogSuccAct活動)。Android 4.x 應用程式開發之鑰 王安邦對應的畫面配置Main.xmlLogsucc.xml第1個Textview本例暫不會用到。對應的畫面配置  
  • 13. 2.啟動另一活動未夾帶資料-4主程式(Ch06startActWoBundle.java)內含Ch06startActWoBundle活動(為主活動),專案執行時,會先執行此活動。Android 4.x 應用程式開發之鑰 王安邦
  • 14. 2.啟動另一活動未夾帶資料-5被呼叫的程式(LogsuccAct.java)內含LogsuccAct活動,顯示”登入成功,歡迎進入 !”的訊息。Android 4.x 應用程式開發之鑰 王安邦
  • 15. 3.啟動另一活動且夾帶資料-1本例含下列兩個活動: Ch06startActWtBundle活動:顯示下圖左的畫面,讓使用者輸入姓名及性別(male或female),輸入完,按 確定 鈕,接著以startActivity()方法呼叫另一LogSuccAct活動,且把使用者輸入的姓名及性別傳送資料給此活動,顯示登入成功的畫面。 LogSuccAct活動:接收Ch06startActWtBundle活動所傳過來的使用者輸入的姓名及性別,判斷性別為male或female,以先生或小姐向登入者打招呼,並顯示登入成功的畫面,如下圖右。Android 4.x 應用程式開發之鑰 王安邦Ch06startActWtBundle活動畫面LogSuccAct活動畫面
  • 16. 3.啟動另一活動且夾帶資料-2建立一個Android專案。 Project Name:Ch06startActWtBundle Build Target:Android 4.0(API 14) Application:Ch06呼叫活動夾帶資料 Package Name:andbas.Ch06startActWtBundle Create Activity:要勾選,並輸入活動名稱Ch06startActWtBundle。 Minimum SDK:15。 系統已經幫忙建立了Ch06startActWtBundle的活動及AndroidManifest.xml檔,下面將修改Ch06startActWtBundle,新增所要的功能。 strings.xml檔的內容如下:Android 4.x 應用程式開發之鑰 王安邦
  • 17. 3.啟動另一活動且夾帶資料-3有兩個活動的畫面配置檔:main.xml(主活動)及logsucc.xml(LogSuccAct活動),內容與6-2節皆一樣。 主程式(Ch06startActWtBundle.java)內含Ch06startActWtBundle活動(為主活動),專案執行時,會先執行此活動。Android 4.x 應用程式開發之鑰 王安邦
  • 18. 3.啟動另一活動且夾帶資料-4被呼叫的程式(LogsuccAct.java)內含LogsuccAct活動,接收Ch06startActWtBundle活動所傳過來的使用者輸入的姓名及性別,判斷性別為male或female,以先生或小姐向登入者打招呼,並顯示登入成功的畫面,顯示”登入成功,歡迎進入 !”的訊息。Android 4.x 應用程式開發之鑰 王安邦
  • 19. 4.啟動另一活動並由該活動傳回資料-1本例含下列兩個活動: Ch06startActForResult活動:顯示下圖左的畫面,讓使用者輸入姓名及性別(male或female),輸入完,按 確定 鈕,接著以startActivityForResult()方法呼叫另一LogSuccAct活動,且把使用者輸入的姓名及性別傳送資料給此活動,並等候LogSuccAct活動傳回一個招呼語(sayHello),再以toast加予顯示”XXX先生, 你好!”或”XXX小姐, 妳好!”。 LogSuccAct活動:接收Ch06startActForResult活動所傳過來的使用者輸入的姓名及性別,判斷性別為male或female,以先生或小姐向登入者打招呼,如下圖右,並把招呼語”XXX先生, 你好!”或”XXX小姐, 妳好!”存給變數sayHello,再把此變數的值傳給Ch06startActForResult活動(主活動),並在主活動以toast加予顯示。Android 4.x 應用程式開發之鑰 王安邦Ch06startActForResult活動畫面LogSuccAct活動畫面
  • 20. 4.啟動另一活動並由該活動傳回資料-2建立一個Android專案。 Project Name:Ch06startActForResult Build Target:Android 4.0(API 14) Application:Ch06呼叫活動傳回資料 Package Name:andbas.Ch06startActForResult Create Activity:要勾選,並輸入活動名稱Ch06startActForResult。 Minimum SDK:15。 系統已經幫忙建立了Ch06startActForResult的活動及AndroidManifest.xml檔,下面將修改Ch06startActForResult,新增所要的功能。 strings.xml檔的內容如下:Android 4.x 應用程式開發之鑰 王安邦
  • 21. 4.啟動另一活動並由該活動傳回資料-3有兩個活動的畫面配置檔:main.xml(主活動)與6-2節皆一樣,但logsucc.xml(LogSuccAct活動)內容不同,如下所示。Android 4.x 應用程式開發之鑰 王安邦
  • 22. 4.啟動另一活動並由該活動傳回資料-4主程式(Ch06startActForResult.java)內含Ch06startActForResult活動(為主活動),專案執行時,會先執行此活動。Android 4.x 應用程式開發之鑰 王安邦
  • 23. 4.啟動另一活動並由該活動傳回資料-5Android 4.x 應用程式開發之鑰 王安邦
  • 24. 4.啟動另一活動並由該活動傳回資料-6被呼叫的程式(LogsuccAct.java)內含LogsuccAct活動,接收Ch06startActForResult活動所傳過來的使用者輸入的姓名及性別,判斷性別為male或female,以先生或小姐,向登入者打招呼,並顯示登入成功的畫面,顯示”登入成功,歡迎進入 !”的訊息,並把招呼語”XXX先生, 你好!”或”XXX小姐, 妳好!”存給變數sayHello,最後當使用者按 確定 鈕時,再把此變數(sayHello)的值傳給Ch06startActForResult活動,並以toast加予顯示。Android 4.x 應用程式開發之鑰 王安邦
  • 25. 4.啟動另一活動並由該活動傳回資料-7Android 4.x 應用程式開發之鑰 王安邦
  • 26. 5.執行特定工作的活動-1本節將以一例子來說明,本例一開始會顯示一個功能表,含4個按鈕:撥打電話、瀏覽網頁、播放音樂、檢視照片。當使用者按 撥打電話 鈕,則直接呼叫Android系統內建的的撥打電話讓你打電話;當使用者按 瀏覽網頁 鈕,則直接呼叫Android系統內建的的網頁瀏覽器瀏覽指定的網頁;當使用者按 播放音樂 鈕,則直接呼叫Android系統內建的的音樂器播放指定音樂;當使用者按 檢視照片 鈕,則直接呼叫Android系統內建的的檢視照片程式檢視指定的照片。Android 4.x 應用程式開發之鑰 王安邦
  • 27. 5.執行特定工作的活動-2建立一個Android專案。 Project Name:Ch06ActSpecTask Build Target:Android 4.0(API 14) Application:Ch06活動執行特定工作 Package Name:andbas.Ch06ActSpecTask Create Activity:要勾選,並輸入活動名稱Ch06ActSpecTask。 Minimum SDK:15。 系統已經幫忙建立了Ch06ActSpecTask的活動及AndroidManifest.xml檔,下面將修改Ch06ActSpecTask,新增所要的功能。 strings.xml檔的內容如下:Android 4.x 應用程式開發之鑰 王安邦
  • 28. 5.執行特定工作的活動-3活動的畫面配置檔main.xml(主活動)內容如下所示。Android 4.x 應用程式開發之鑰 王安邦
  • 29. 5.執行特定工作的活動-4主程式(Ch06ActSpecTask.java)內含Ch06ActSpecTask活動(為主活動),專案執行時,會執行此活動。Android 4.x 應用程式開發之鑰 王安邦
  • 30. 5.執行特定工作的活動-5Android 4.x 應用程式開發之鑰 王安邦
  • 31. 6.意圖篩選器(Intent Filter)-1意圖篩選器(intent filters)是用來讓系統辦識一意圖中所指的元件(component)是那一個。 意圖篩選器()是要定義在清單檔(AndroidManifest.xml)中,內含下面三個子元素: 元素:指示意圖所要採取的動作。下例指出一活動為應用程式的主要入口點。 元素:指示分類名稱(category name),最常見名稱為LAUNCHER(啟動佇列)。下例指出把一活動放進啟動佇列,如此當該應用程式安裝到設備時,才會自動地加予執行。 < data />元素:指示意圖所需的資料。Android 4.x 應用程式開發之鑰 王安邦
  • 32. 6.意圖篩選器(Intent Filter)-2當Android系統接收到一個意圖(intent)時,它會把全部設有意圖篩選器()的活動依照下面的原則作比對,以以找出滿足條件的活動,其比對的原則,依序如下: 先比對action項目:在元素中所指定動作(action)必須與意圖所要求的動作一致。 再比對category項目:在元素中所指定目錄(category)必須與意圖所要求的目錄一致。如果意圖中沒有指定category,則視為DEFAULT。 最後比對data項目:在元素中所指定資料的方案(scheme)、資料類型(type)必須與意圖所要求的資料一致。Android 4.x 應用程式開發之鑰 王安邦
  • 33. 6.意圖篩選器(Intent Filter)-3下面將以一例子來說明,本例含兩個程式: Ch06IntentFilter.java:一開始會顯示一個功能表,含4個按鈕:撥打電話、瀏覽網頁、播放音樂、檢視照片。當使用者按 撥打電話 鈕,可讓你打電話;當使用者按 瀏覽網頁 鈕,可瀏覽指定的網頁;當使用者按 播放音樂 鈕,可播放指定音樂;當使用者按 檢視照片 鈕,可檢視指定的照片。 AnotherAct.java:此程式的主要作用是在AndroidManifest.xml清單檔中以Intent-Filter(意圖篩選器)宣稱它(即活動)具有下列4個功能:撥打電話、瀏覽網頁、播放音樂、檢視照片,但程式中實際上並沒有含4個功能的相關程式碼,當使用者選擇此活動的任一功能時,只顯示一個有關該功能的訊息。本例只是用來說明Android系統如何去尋找滿足條件的活動,及其比對的原則。Android 4.x 應用程式開發之鑰 王安邦
  • 34. 6.意圖篩選器(Intent Filter)-4執行結果說明如下:Android 4.x 應用程式開發之鑰 王安邦
  • 35. 6.意圖篩選器(Intent Filter)-5建立一個Android專案。 Project Name:Ch06IntentFilter Build Target:Android 4.0(API 14) Application:Ch06活動執行特定工作 Package Name:andbas. Ch06IntentFilter Create Activity:要勾選,並輸入活動名稱Ch06IntentFilter。 Minimum SDK:15。 系統已經幫忙建立了Ch06IntentFilter的活動及AndroidManifest.xml檔,下面將修改Ch06IntentFilter,新增所要的功能,另也需修改AndroidManifest.xml檔。 strings.xml檔的內容如下:Android 4.x 應用程式開發之鑰 王安邦
  • 36. 6.意圖篩選器(Intent Filter)-6Ch06IntentFilter.java檔的畫面配置檔main.xml(主活動)內容與6-5節的一樣,AnotherAct.java檔的畫面配置檔(anotheract.xml),只含一個LinearLayout物件,如下所示。Android 4.x 應用程式開發之鑰 王安邦
  • 37. 6.意圖篩選器(Intent Filter)-7本例最主要的不同在AndroidManifest.xml檔,下面將說明其作用。Android 4.x 應用程式開發之鑰 王安邦    
  • 38. 6.意圖篩選器(Intent Filter)-8主程式(Ch06IntentFilter.java)與Ch06ActSpecTask.java一樣,因此在此就不列出。 另一程式(AnotherAct.java)的程式如下。 Android 4.x 應用程式開發之鑰 王安邦
  • 39. 6.意圖篩選器(Intent Filter)-9Android 4.x 應用程式開發之鑰 王安邦
  • 40. 7.管理活動的生命週期(Managing the Activity Lifecycle)活動基本上存在三種狀態(state): 恢復(Resumed):該活動是在螢幕的前景和具使用者焦點。(此狀態,有時也稱為“執行中”(running)。) 暫停(Paused):另一項活動是在螢幕的前景且取得焦點,但是這一活動尚未可見,也就是說,另一項活動是在這一個活動的頂部而且是可見的,而該活動是部分透明的或未覆蓋整個螢幕。一個暫停的活動完全是活著的(活動的物件是儲存在記憶體中,它維護所有狀態及成員訊息,並與視窗管理者保持連接),但是當記憶體極度不足的情況下,它可以被系統刪除。 已停止(Stopped):該活動是完全被另一個活動遮蔽(亦即該活動是在“幕後”)。停止的活動也仍然活著(活動的物件是儲存在記憶體中,它維護所有狀態及成員訊息,但並不與視窗管理者保持連接)。然而,對使用者來說,它不再是可見的,當別地方需要記憶體時,它可以被系統刪除。 Android 4.x 應用程式開發之鑰 王安邦
  • 41. 7-1 活動的生命週期Android 4.x 應用程式開發之鑰 王安邦
  • 42. 7-2 實作生命週期的回呼方法(Implementing the lifecycle callbacks)Android 4.x 應用程式開發之鑰 王安邦
  • 43. 7-3 儲存活動狀態(Saving activity state)Android 4.x 應用程式開發之鑰 王安邦
  • 44. 7-4 處理組態變化(Handling configuration changes)有些設備組態在執行期間中時可能改變(如螢幕方向、鍵盤的可用性、及語言)。當發生這樣的變化,Android會把作用中的活動重新啟動(onDestroy()被呼叫,隨後立即呼叫onCreate())。重新啟動的目的是幫助您的應用程式自動重新載入,並應用您所提供的替代資源,以適應新的組態。如果您設計的活動能妥善處理這事件,這將使得面對活動生命週期中不可預期的事件,能有更有彈性的處理方式。 處理組態更改(如改變螢幕方向)最好的辦法是用onSaveInstanceState()和onRestoreInstanceState()(或onCreate())方法把應用程式的狀態加予儲存。Android 4.x 應用程式開發之鑰 王安邦
  • 45. 7-5 協調活動(Coordinating activities)當一個活動啟動另一活動,它們共同經歷生命週期的轉換,第一項活動暫停和停止(不過,如果它在幕後仍然可見,它不會停止),而其他活動創建,在這情況下,這些活動共享資料,亦即在第一個活動尚未完全停止之前,第二個活動被創建,另外,有可能第二個活動啟動的行程與第一個活動停止的行程是重疊的。 生命週期回呼的順序是被明確定義的,尤其是當這兩個活動在同一行程中且是一個活動啟動另一活動。 這可預見的生命週期回呼順序,可讓您管理一個活動轉移到另一個活動的訊息。例如,當第一個活動停止時,如要讓第二個活動可讀取第一個活動的資料,這時您必須把資料寫入資料庫中,而你應該在onPause()內寫入資料庫,而不是在onStop()內。Android 4.x 應用程式開發之鑰 王安邦
  • 46. 本章學習重點了解活動(activity)的基本觀念 學習啟動活動的4種方式: 啟動另一活動未夾帶資料 啟動另一活動且夾帶資料 啟動另一活動並由該活動傳回資料 啟動執行特定工作的活動 了解意圖篩選器(Intent Filter)的作用。 學習管理活動的生命週期(Managing the Activity Lifecycle)。 Android 4.x 應用程式開發之鑰 王安邦