應用程式基礎知識:activity和intent——Android開發祕籍

turingbooks發表於2020-04-07

應用程式基礎知識:activity和intent

——Android開發祕籍

  每個Android應用程式在開發時都是一個獨立的Android工程。本章介紹了Android工程目錄結構,並簡要概述程式的基本組成模組,這些內容為理解本書的祕訣提供了非常有用的背景知識。本章的後半部分將著重講解activitiy以及觸發這些activityintent

2.1 Android應用程式預覽

Android應用程式可以包含五花八門的功能,比如編輯文字、播放音樂、設定鬧鐘還有開啟通訊錄等。這些功能可以劃分為以下四類Android元件(見表2-1),每個元件都歸屬於一個Java基礎類。

2-1 Android應用程式所包含的四種元件

功  能

Java基礎類

範  例

關注使用者操作

Activity

編輯文字,玩遊戲

後臺程式

Service

播放音樂,更新天氣圖示

接收訊息

BroadcastReceiver

根據特定事件觸發警報

存取資料

ContentProvider

開啟手機通訊錄

每個Android應用都由一個或多個元件組成。當要用到某個元件的時候,Android作業系統就會將它們例項化。在擁有特定許可權的情況下,其他應用程式同樣也可以使用它們。

Android作業系統整合了很多功能(某些功能甚至並非和某個應用程式直接相關,如呼入電話),每個元件都具有以下生命週期,包括建立(create)、獲得焦點(focus)、失去焦點(defocus)和銷燬(destroy)。我們可以通過改寫程式預設的行為,使互動對使用者更加友好,比如儲存變數或者恢復使用者介面元素。

除了ContentProvider元件,每個元件都需要一個叫做Intent的非同步訊息來啟用。Intent可包含一組(Bundle)描述該元件的輔助資料。這也提供了一種在元件之間傳遞訊息的方法。

本章最後將會使用最常見的元件Activity來演示前面提到的概念。由於activity總是和具體的使用者互動相關,所以每個activity在建立的時候會自動建立一個新視窗。當然還會提到一些關於UI的概要介紹。至於ServiceBroadcastReceiver這兩個元件我們將會在第3章講解,而ContentProvider則會在第9章闡述。

2.1.1 祕訣1:建立工程並新建activity

建立Android工程或者元件最簡單的方法莫過於使用Eclipse提供的整合開發環境(IDE),該方法能夠確保正確安裝輔助檔案。建立Android工程的具體過程如下所示。

(1) Eclipse中,選擇FileNewAndroid Project。然後就會顯示Android工程的建立畫面。

(2) 填寫工程名稱(Project name),此處輸入SimpleActivityExample

(3) Build Target選項框中選擇編譯目標,這些選項與開發電腦的SDK版本有關。

(4) 填寫程式名稱(Application name),此處為Example of Basic Activity

(5) 填寫應用程式包名稱(Package name),此處為com.cookbook.simple_activity

(6) 根據同樣的步驟建立主activity,注意一定要勾選Create Activity,並填寫activity名稱,此處為SimpleActivity

所有的activity都繼承於抽象類Activity或者其子類,並通過onCreate()方法建立。activity通常在初始化的時候都會過載該方法,比如設定UI、建立監聽按鈕、初始化引數或者開啟執行緒等。

如果在建立工程時沒有建立主activity,或者需要新增其他activity,可以通過以下步驟來建立activity

(1) 首先建立一個新類擴充套件Activity類。(在Eclipse中,右鍵單擊project,選擇NewClass,然後指定android.app.Activity作為父類。)

(2) 過載onCreate()功能。(在Eclipse中,右鍵單擊class檔案,選擇SourceOverride/ Implement Methods...,然後勾選onCreate()方法。)

(3) 作為最常被過載的方法之一,activity也必須啟用父類方法,否則執行時可能會丟擲異常。如清單2-1所示首先呼叫super.onCreate()方法,確保正確初始化activity

清單2-1 src/com/cookbook/simple_activity/SimpleActivity.java

 

(4) 如果使用UI,則要在res/layout/目錄下的一個XML檔案中指定頁面佈局。此處為main.xml,如清單2-2所示。

清單2-2 res/layout/main.xml

 

(5) 通過setContentView()方法設定activity的佈局,並將XML佈局檔案作為resource ID傳遞給它。此處為R.layout.main,見清單2-1

(6) AndroidManifest XML檔案中宣告activity的屬性,詳細內容見清單2-5

注意字串型別的資源要在res/values/資料夾下的strings.xml檔案中定義,如清單2-3所示。所有字串都集中於此處定義,可以方便修改或重用。

清單2-3 res/values/strings.xml

<![endif]>

![if>![endif]-->!--[if>

 

現在我們進一步探討該工程的目錄結構和自動生成內容。

![if>![endif]-->!--[if>

2.1.2 工程目錄結構及自動生成內容

2-1Eclipse Package Explorer顯示的一個工程結構示例。

Android 2.0庫檔案以外,該工程的目錄結構中的檔案既有使用者建立的也有系統自動生成的。

使用者建立的檔案如下所示。

q <![endif]>src/是開發者自己編寫的或者匯入Java每個包可以包含多個不同的.java類檔案。

![if>

q <![endif]>res/layout/用來存放說明每個介面佈局的XML檔案。

![if>

q <![endif]>res/values/用來存放被其他檔案所引用的XML格式的資原始檔。

![if>

q <![endif]>res/drawable-hdpi/res/drawable-mdpi/res/drawable-ldpi/是程式所使用圖片的資源目錄,分別存放高、中、低不同dpi解析度的圖片。

![if>

q <![endif]>assets/存放程式使用的nonmedia檔案。

![if>

q <![endif]>AndroidManifest.xmlAndroid作業系統說明該工程。

![if>

自動生成的檔案如下所示。

q <![endif]>gen/存放系統自動生成程式碼,包括生成的R.java類。

![if>

q <![endif]>default.properties存放工程環境資訊。儘管該檔案由系統自動生成的,但開發人員也可以根據需要修改。

![if>

應用程式的資源包括描述佈局的XML檔案,描述字串值、UI元素標籤的XML檔案,以及其他如圖片、聲音等輔助檔案。編譯時,對資源的引用都會新增到自動生成的包裝類R.java中。該檔案由AndroidAsset打包工具(aapt)自動生成。清單2-4為祕訣1使用的該檔案。

清單2-4 gen/com/cookbook/simple_activity/R.java

 

此處的每個資源都被對映成一個唯一的整型值。通過這種方式,R.java類提供了一種在Java程式碼中引用外部資源的方法。例如想要在Java檔案中引用main.xml佈局檔案,就需要使用整型值R.layout.main。如果是在XML檔案中引用main.xml檔案,就需要使用"@layout/main"字串。

Java或者XML檔案中引用資源請參見表2-2。請注意,假若要定義一個IDhome_button的按鈕,需要在引用字串前新增“+”號,即:@+id/home_button。第4章再詳細地探討資源引用,此處內容對本章祕訣的學習已經足夠。

2-2 在JavaXML檔案中引用不同的資源

資  源

Java中引用

XML中引用

res/layout/main.xml

R.layout.main

@layout/main

res/drawable-hdpi/icon.png

R.drawable.icon

@drawable/icon

@+id/home_button

R.id.home_button

@id/home_button

<string name="hello">

R.string.hello

@string/hello

2.1.3 Android包和Manifest清單檔案

Android工程,有時也稱為Android包,是Java包的集合。不同的Android包可以包含相同名稱的Java包,但在安裝到Android裝置上時,各個Android包的名字必須是唯一的。

為了作業系統能夠正確訪問這些Android包,每個應用程式必須在名為AndroidManifest XML檔案中註冊宣告它所使用的元件。此外該XML檔案還包含執行該應用程式所需的許可權及操作。清單2-5為祕訣1所用檔案。

清單2-5 AndroidManifest.xml

 

Android包所有XML檔案第一行都必須指定編碼,該行程式碼為標準程式碼。manifest元素定義Android包的名稱和版本號。versionCode可以根據你的程式情況定義,為確定版本高低關係的一個整數。versionName採用人可讀懂的格式表示,可以宣告主次修訂版本號。

application元素定義使用者從Android裝置選單可以看到的應用程式圖示和名稱。名稱是一個字串,為了確保在使用者裝置中將其顯示在應用圖示下方,應該儘量使其簡短。一般來說,名稱最多兩個單詞,每個單詞最好在十個字元之內,中間不能含有空格。

activity元素定義程式啟動時觸發的主activity,以及該activity啟用後標題欄中顯示的名稱。在這兒需要指定Java包名,本例為com.cookbook.simple_activity,相應activity名稱為Simple- Activity。由於Java包名稱一般和Android包名稱一致,所以常常會使用縮寫SimpleActivity。不過最好記住Android包和Java包還是有區別的。

intent-filter元素向系統說明該元件功能。鑑於此作用,它可以包含多個actioncategory或者data元素。該點在不同的祕訣中都有所體現。

uses-sdk元素定義執行此程式所需的API級別。一般來說,API級別定義如下:

由於Android系統向前相容,maxSdkVersion所定義的最高API支援版本會令人極度沮喪,因為它不支援Android 2.0.1及之後的版本。targetSdkVersion可要可不要,該項用於允許同一SDK版本的裝置禁用加快操作速度的升級相容性設定。但minSdkVersion必須定義,以確保應用程式在不支援該應用所需的功能的平臺上執行時不會崩潰,定義時儘可能選擇較低的API級別。

AndroidManifest存放執行該應用程式所需的許可權。我們會在隨後的章節中進一步詳細闡述,但以上部分基本可以涵蓋本章祕訣。

2.1.4 重新命名應用程式中的部分檔案

有時候我們需要重新命名Android工程的部分檔案,或許是從本書中手動複製一個檔案放在工程中,或許是在開發過程修改了程式名稱,需要在檔案系統的目錄樹反映出來。Android提供了工具幫我們自動完成此項工作,並且可以同步更新交叉引用。例如在Eclipse IDE中,使用下列不同的方式來重新命名應用程式的部分檔案。

q <![endif]>重新命名Android工程,步驟如下:

![if>

(1) 右鍵單擊該工程選擇RefactorMove移到檔案系統中的一個新目錄;

(2) 右鍵單擊該工程選擇RefactorRename重新命名工程。

q <![endif]>重新命名Android包,步驟如下:

![if>

(1) 右鍵單擊該包選擇RefactorRename重新命名該包;

(2) 更新AndroidManifest.xml包名稱。

q <![endif]>重新命名Android類(如ActivityServiceBroadcastReceiverContentProvider等主要元件),步驟如下:

![if>

(1) 右鍵單擊該Java檔案選擇RefactorRename重新命名該類檔案;

(2) 更新AndroidManifest.xml確保android:name使用新元件名。

注意重新命名XML檔案等其他型別檔案的時候,通常都要手動修改Java程式碼中的相應的引用。

2.2 Activity的生命週期

程式中的每個activity都有自己的生命週期。通過呼叫onCreate()方法,activity能且僅能被建立一次。當onDestroy()方法執行時,該activity隨即關閉。正如圖2-2所闡述的那樣,不同事件可以導致activity不同的執行狀態。祕訣2將為我們一一呈現這些功能。

2-2 activity的生命週期,來源:http://developer.android.com/

![if>![endif]-->!--[if>

2.2.1 祕訣2:使用其他的生命週期方法

下面的祕訣提供了一種檢視活動中activity生命週期的簡單方法。為便於演示,每個被過載的方法都有明確說明,我們通過加入Toast命令,使得該方法在啟動的時候,在螢幕上顯示。(關於Toast微件的更多內容請參見第3章)。在Android裝置上執行以下程式碼(如清單2-6所示),並嘗試各種情況,特別是注意以下幾種操作:

q <![endif]>顛倒螢幕方向,將結束並重新執行activity

![if>

q <![endif]>按下Home按鈕將暫停activity,但並不結束;

![if>

q <![endif]>按下程式圖示可能會開啟新的activity例項,即使先前的activity沒有關閉;

![if>

q <![endif]>螢幕處於休眠態時會暫停activity,螢幕重新喚醒時會繼續該activity(類似於呼入電話)。

![if>

清單2-6 src/com/cookbook/activity_lifecycle/ActivityLifecycle.java

 

我們可以看到,使用者的很多常見操作都可能會導致activity暫停執行、結束甚至啟動數個應用程式版本。在繼續下一部分內容之前,有必要給大家介紹兩種方法來控制這種操作行為。

2.2.2 祕訣3:強制執行單任務模式

如果應用程式跳轉走後再次啟動的話,可能會在裝置上產生多個activity例項。最終為釋放記憶體,多餘的activity例項會被系統殺死,但與此同時,也很可能會導致異常。為避免上述情況發生,程式設計師可以在AndroidManifest中控制每個activity的這種行為。

為確保裝置上只有一個activity例項在執行,需要在activity元素中包含MAINLAUNCHER兩個intent過濾器,如下:

該行程式碼確保在任務中的任何時刻,每個activity都只有唯一一個執行例項。此外,該例項的所有子activity都作為自身任務啟動。為進一步限制應用程式中的所有activity都只能執行一個例項,不妨使用以下程式碼:

這樣使得所有activity作為同一個任務,共享資訊非常方便。

此外,有時我們希望無論使用者通過什麼方式進入activity都能夠儲存任務的狀態。例如,如果使用者離開了應用程式,不久後又重新啟動了該應用程式,預設情況下系統會重設任務到初始化狀態。為確保使用者總是能返回到關閉之前的狀態,需要在任務的根activityactivity元素的屬性中作如下定義:

2.2.3 祕訣4:強制螢幕方向

每個帶有加速度計的Android裝置都可以判定方向。當裝置由縱向模式切換到橫向模式時,預設動作是相應地旋轉應用程式檢視。然而祕訣2,倒置螢幕會導致已經結束的activity重新啟動。如果是這種情況,那麼就會丟掉當前的程式狀態,從而破壞使用者體驗。

解決螢幕倒置問題的一種方案是在發生改變之前儲存使用者的狀態,改變方向後重新啟動activity時讀取使用者先前狀態。還有一種更簡單的辦法,就是強制設定螢幕的方向,禁止旋轉切換檢視。AndroidManifest中列出的每個activity都可以定義螢幕方向。比如為了指定某個activity始終以縱向模式執行,在activity元素中可以新增如下程式碼:

同樣,如果想設定為橫向模式,可以使用如下程式碼:

然而,在硬鍵盤滑出時,先前的情況還是會導致activity的關閉和重新啟動。所以我們可以採用第三種辦法,即告知Android系統處理應用程式方向和鍵盤滑出事件。可以在activity元素的屬性中新增如下程式碼:

該方法可以單獨使用,也可以和screenOrientation屬性結合在一起使用,視應用程式要求而定。

2.2.4 祕訣5儲存和恢復activity資訊

每當一個activity即將被殺死時,都會呼叫onSaveInstanceState()方法。過載該方法可以儲存相關狀態資訊。當重新建立該activity時,則會呼叫onRestoreInstanceState()方法。過載該方法可以獲取先前儲存的狀態資訊。這樣當應用程式經歷生命週期變化時,就可以為使用者帶來無縫體驗。值得注意的是,大部分UI控制元件狀態都不需要我們親自處理,系統會自動幫我們完成此項工作。

onPause()方法略有不同。如果另一個元件在activity中啟動,就會呼叫onPause()方法暫停此activity活動。稍後系統如要回收記憶體等資源時,該activity仍然處於暫停狀態,Android系統就會呼叫onSaveInstanceState()方法儲存狀態資訊,然後將其殺死。

清單2-7為存取包含一個string陣列和一個float陣列的例項狀態資訊的示例。

清單2-7 SaveInstanceState()onRestoreInstanceState()示例

 

請注意,onCreate()方法也包含Bundle savedInstanceState。當activity關閉之後重新初始化,之前onSaveInstanceState()方法中儲存的bundle狀態資訊會傳遞給onCreate()方法。總之,所有儲存的狀態資訊都會傳遞給onRestoreInstanceState()方法,所以自然會利用它來恢復之前狀態。

2.3 多個activity

即使最簡單的應用程式也會擁有多個功能,所以經常需要使用多個activity。比如,一個遊戲可能包含兩個activity,一個用來顯示高分排行榜,另一個則用來顯示遊戲畫面。一個記事本程式可能包含三個activity:檢視筆記列表、閱讀某條筆記、編輯某條筆記或加新筆記。

當程式啟動時,就會執行AndroidManifest XML檔案中定義的主activity。通過事件觸發,可以跳轉到另外一個activity。當第二個activity被啟用時,先前的主activity就處於暫停狀態。當第二個activity執行結束後,主activity 就會再次回到前臺恢復執行。

若想啟用程式中的某個元件,可以使用intent直接來指定該元件。但如果想通過intent過濾器指定,則可以使用隱式intent,再由系統決定最合適的元件,不管它是其他應用程式元件還是本機作業系統自帶元件,都可以為其所用。要注意的是,其他應用程式中的隱式intent不需要在當前程式中的AndroidManifest檔案註冊宣告。

Android主張儘可能利用隱式intent為使用者提供強大的功能模組框架。當新開發的元件能滿足隱式intent過濾器的需求,就可以用它來替代Android 的內部intent。譬如,在Android裝置上載入手機通訊錄。當使用者選擇一個聯絡人時,Android系統會自動通過適當的intent過濾器查詢聯絡人來發現所有可用的activity,並讓使用者自己選擇所使用的activity

2.3.1 祕訣6:使用按鈕和文字框

我們使用觸發事件充分演示多個activity的切換。為此,我們在示例中引入了按鈕按下事件。下面將在某個頁面佈局中新增一個按鈕,並指定按鈕被按下時的動作,步驟如下。

(1) XML頁面佈局檔案中宣告一個button控制元件:

(2) 通過佈局檔案中的button ID宣告button控制元件物件:

(3) 新增點選按鈕事件的OnClickListener監聽器:

(4) 過載監聽器的onClick方法執行你想要的動作:

我們可以通過改變螢幕上顯示的文字向使用者反饋互動結果。定義文字框並用程式設計手段來實現改動,步驟如下所示。

(1) XML佈局檔案中通過ID宣告一個textview控制元件。同時也可以初始化,設定為某個值。(此處將其初始化為strings.xml檔案中名為“hello”的字串值。)

(2) 在佈局檔案中宣告一個TextView控制元件,指向TextView ID

(3) 如果要修改文字內容,可以使用setText方法:

這兩個UI技巧將會在本章後面的幾個祕訣中用到。第4章將會系統講解AndroidUI控制元件。

2.3.2 祕訣7通過事件啟動另外一個activity

在本祕訣中,MenuScreen是主activity,如清單2-8所示,這裡將啟動PlayGame activity。其觸發事件為Button微件的單擊事件。

當使用者單擊按鈕時會執行startGame()方法,該方法啟動PlayGame activity。而當使用者在PlayGame activity中點選按鈕時,則會呼叫finish()方法,將控制權移交給呼叫它的activity。啟動activity的步驟如下:

(1) 宣告一個intent,指向即將被啟動的activity

(2) 呼叫該intentstartActivity方法;

(3) AndroidManifest中宣告其他的activity

清單2-8 src/com/cookbook/launch_activity/MenuScreen.java

 

在匿名內部類中提供當前上下文環境

注意,在通過點選按鈕啟動activity時還需要作額外的考慮,如清單2-8所示。intent需要上下文環境。但this引用在onClick方法中不能正確解析。在匿名內部類中提供當前上下文環境的方法如下:

q <![endif]>使用Context.this代替this

![if>

q <![endif]>使用getApplicationContext()來代替this

![if>

q <![endif]>顯式地使用類名MenuScreen.this

![if>

呼叫一個在適當的上下文環境級別中宣告的方法,如清單2-8所使用的startGame()

以上方法都可以互相轉換,我們可以根據需要靈活運用。

清單2-9所示的PlayGame activity只有一個按鈕,帶有onClick監聽器,點選該按鈕呼叫finish()方法會將控制權返回給主activity。當然也可以根據需要為PlayGame activity新增更多的功能模組,每個分支模組的程式碼都可以呼叫finish()方法結束該activity的執行。

清單2-9 src/com/cookbook/launch_activity/PlayGame.java

 

如清單2-10所示,該按鈕必須新增到main.xml佈局檔案中,按鈕的IDplay_game,必須與清單2-8中所宣告的內容相匹配。此處使用和裝置無關的畫素(dip)定義按鈕大小,我們將會在第4章深入討論。

清單2-10 res/layout/main.xml

 

正如清單2-11所示,PlayGame activity引用了其自己的IDend_game的按鈕,該按鈕的佈局資源R.layout.game對應的是XML佈局檔案game.xml

清單2-11 res/layout/game.xml

 

雖然在各種情況下,文字都可以顯式地寫在檔案中,但為每個字串定義變數是一種好的程式設計習慣。在本祕訣中,有play_gameend_game兩個字串值,它們被定義在一個字串XML資原始檔中,見清單2-12所示。

清單2-12 res/values/strings.xml

 

最後需要在AndroidManifest XML檔案中為PlayGame這個新類宣告其預設的action,詳見清單2-13

清單2-13 AndroidManifest.xml

 

2.3.3 祕訣8:將語音轉換成文字並啟動activity顯示結果

本祕訣將演示在啟動activity時如何處理其返回值的問題。同時演示瞭如何利用GoogleRecognizerIntent將語音轉換輸出成文字並在螢幕上顯示的功能。此例的觸發事件同樣是按鈕單擊事件,它將啟動RecognizerIntent activity,辨識麥克風輸入的聲音並將其轉換成文字格式。執行結束後將文字傳回給呼叫它的activity

當返回時,首先會用返回的資料呼叫onActivityResult()方法,然後呼叫onResume()方法使activity正常執行。因為返回的activity可能存在問題,導致不能正確傳遞值,所以必須核查resultCode確保是RESULT_OK才可以繼續解析返回的資料。

請注意,啟動回傳資料的activity通常都會呼叫同一個onActivityResult()方法。所以需要使用請求碼(request code)判斷哪個activity要回傳資料。當activity啟動完成後,就會把控制權重新交回給呼叫它的activity,並用同樣的請求碼呼叫onActivityResult()方法。

啟動帶有返回值的activity的步驟如下。

(1) 通過intent呼叫startActivityForResult(),定義要啟動的activity並標記requestCode

(2) 過載onActivityResult()方法,檢查返回結果的狀態以檢查期望的requestCode,並解析返回資料。

使用RecognizerIntent的步驟如下。

(1) 宣告一個intent,設定其動作為ACTION_RECOGNIZE_SPEECH

(2) intent傳遞附加內容,至少EXTRA_LANGUAGE_MODEL是必需的。它可以被設定成LANGUAGE_MODEL_FREE_FORM或者LANGUAGE_MODEL_WEB_SEARCH

(3) 返回的資料包中包含可能和原文匹配一個字串列表。通過data.getStringArray- ListExtra可以獲取這些資料,它將對映為ArrayList型別資源供稍後使用。

使用TextView將返回的文字顯示到螢幕上。主activity的內容參見清單2-14

此外還有main.xmlstrings.xml這兩個輔助檔案,用於定義按鈕和存放結果的TextView。具體內容可以參考祕訣7中清單2-10以及清單2-12的內容。當前只需要在AndroidManifest中宣告主activity,這點和祕訣1中的步驟一致。RecognizerIntent activityAndroid系統原生的activity,所以在使用前就不需要顯式宣告。

清單2-14 src/com/cookbook/launch_for_result/RecognizerIntentExample.java

 

2.3.4 祕訣9:實現選擇列表

應用程式中常常需要提供給使用者一個選擇列表以供使用者點選選擇,利用Activity的子類ListActivity就可以實現該功能,並根據使用者的選擇觸發事件。

建立選擇列表的具體步驟如下。

(1) 首先建立一個類擴充套件ListActivity類,而非Activity類:

(2) 建立一個字串陣列,為每個選項指定標籤:

(3) 通過ArrayAdapter呼叫setListAdapter()方法,並指明該選擇列表和佈局方式:

(4) 執行OnItemClickListener監聽確定使用者選擇了哪個選項,並針對其作出反饋:

 

上述技巧在下一個祕訣中也會用到。

2.3.5 祕訣10使用隱式intent建立activity

隱式intent不會確切指定需要使用哪個元件。相反,它們通過過濾器確定所需要的功能,再由Android系統選擇最匹配該功能的元件。intent過濾器可以是動作、資料或者分類(category)。

動作是最常用的intent過濾器,而其中又數ACTION_VIEW最為常用。它需要宣告一個統一資源識別符號(URI),用來向使用者顯示資料。對於給定的URI選擇最佳的處理方式。例如在下面的範例中,隱式intentcase 012中雖然句法格式相同,但產生的結果卻大大不同。

使用隱式intent啟動activity的步驟如下:

(1) intent宣告恰當的intent過濾器(ACTION_VIEWACTION_WEB_SEARCH等);

(2) intent新增執行某個activity所需要的附加資訊;

(3) intent傳遞給startActivity()

清單2-15將演示如何處理多個intent

清單2-15 src/com/cookbook/implicit_intents/ListActivityExample.java

 

2.3.6 祕訣11:在activity間傳遞基本資料型別

我們有時需要向被呼叫的activity傳遞資料,而有時被呼叫的activity反過來也需要向呼叫它的activity回傳資料。比如,遊戲最後得分就需要回傳給高分排行榜介面。activity之間傳遞資訊的方式有如下幾種:

q <![endif]>在發起呼叫的activity中宣告相關變數(如public int finalScore),在被呼叫的activity中就可以為這些變數賦值(如CallingActivity.finalScore=score);

![if>

q <![endif]>通過Bundle包附加資料(本例演示);

![if>

q <![endif]>利用Preference屬性儲存資料,需要時再讀取(將會在第5章中闡述);

![if>

q <![endif]>利用SQLite資料庫儲存資料,需要時再讀取(將會在第9章中闡述)。

![if>

Bundle包是字串值到各種parcelable型別的對映。它在向intent附加屬性值時建立。下例將演示如何從主activity向它所啟動的activity傳遞資料,並且在後者修改資料之後回傳結果。

StartScreen activity中宣告瞭兩個變數(本例中為一個整形變數和一個字串型別變數)。當建立intent呼叫PlayGame類時,通過putExtra方法將這兩個變數傳給intent。當結果從被呼叫的activity返回後,可以使用getExtras方法讀取變數值。呼叫程式如清單2-16所示。

清單2-16 src/com/cookbook/passing_data_activities/StartScreen.java

 

傳遞給PlayGame activity的變數值可以使用getIntExtragetStringExtra方法讀取。當該activity結束後呼叫intent回傳時,我們就可以使用putExtra方法返回資料到發出呼叫的activity。具體呼叫程式碼見清單2-17所示。

清單2-17 src/com/cookbook/passing_data_activities/PlayGame.java

 

相關文章