日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第 5 章 第二个 activity

發(fā)布時(shí)間:2025/6/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第 5 章 第二个 activity 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

請(qǐng)參考教材,全面理解和完成本章節(jié)內(nèi)容... ...

復(fù)制第四章的工程ch4,將工程目錄改名為ch5。

之前的GeoQuiz應(yīng)用只有一個(gè)activity,它負(fù)責(zé)管理著主界面。本章,將為應(yīng)用增加名為CheatActivity的第二個(gè)activity,它管理第二個(gè)用戶界面,可利用此界面查看當(dāng)前問(wèn)題的答案,如圖5-1所示。

圖5-1 CheatActivity提供了偷看答案的機(jī)會(huì)

如果用戶選擇先查看答案,然后再返回QuizActivity回答問(wèn)題,則會(huì)收到一條新的信息,如圖5-2所示。

圖5-2 有沒(méi)有偷看答案,別想瞞過(guò)QuizActivity

5.1? 創(chuàng)建第二個(gè) activity

要?jiǎng)?chuàng)建新的activity,接下來(lái)要做的事不少。首先創(chuàng)建CheatActivity所需的布局文件,然后創(chuàng)建CheatActivity類本身。

不過(guò),現(xiàn)在我們還是先打開(kāi)strings.xml文件,添加本章需要的所有字符串資源,如代碼清單5-1所示。

代碼清單5-1 添加字符串資源(strings.xml)

5.1.1 創(chuàng)建新布局

本章開(kāi)頭的屏幕截圖(圖5-1)展示了CheatActivity視圖的大致樣貌。圖5-3描述了它的組件定義。

圖5-3 CheatActivity的布局圖示

為創(chuàng)建布局文件, 在項(xiàng)目導(dǎo)航視圖中打開(kāi)app\res\layout目錄, 右擊layout目錄, 選擇New->Layout Resource file。(New->XML也行)

?

圖5-4 創(chuàng)建新的布局文件

在接下來(lái)彈出的對(duì)話框中,輸入布局文件名activity_cheat.xml并選擇LinerLayout作為根元素(Root Tag),最后單擊Finish按鈕完成,如圖5-5所示。

圖5-5 命名新布局文件

布局向?qū)б呀?jīng)添加了LinerLayout根元素。接下來(lái)只需添加一個(gè)android:gravity屬性和其他三個(gè)子元素即可。

以后,我們將不再列示大段的XML代碼,而僅以圖5-3的方式給出布局組件圖示。最好現(xiàn)在開(kāi)始習(xí)慣參照?qǐng)D5-3創(chuàng)建布局XML文件。完成創(chuàng)建activity_cheat.xml布局文件后,記得對(duì)照代碼清單5-2進(jìn)行檢查核對(duì)。

代碼清單5-2 第二個(gè)activity的布局組件定義(activity_cheat.xml)

保存布局文件,切換到圖形工具模式預(yù)覽新建布局。雖然沒(méi)有創(chuàng)建供設(shè)備橫屏使用的布局文件,不過(guò),借助開(kāi)發(fā)工具,我們可以預(yù)覽默認(rèn)布局橫屏?xí)r的顯示效果。

在圖形布局工具中,找到預(yù)覽界面上方工具欄里的一個(gè)設(shè)備(紅框)模樣的按鈕。單擊該按鈕切換布局預(yù)覽方位,如圖5-6所示。

圖5-6 水平方位預(yù)覽布局(activity_cheat.xml)

可以看到,默認(rèn)布局在豎直與水平方位下效果都不錯(cuò)。布局搞定了,接下來(lái)我們來(lái)創(chuàng)建新的activity子類CheatActivity類。

5.1.2 創(chuàng)建新的activity子類

在項(xiàng)目導(dǎo)航視圖中,展開(kāi)app\java目錄,右鍵單擊com.xq.geoquiz包,選擇New → Class菜單項(xiàng)。在隨后彈出的對(duì)話框中,將類命名為 CheatActivity, 點(diǎn)擊OK按鈕完成創(chuàng)建,如圖5-7所示。

圖5-7 創(chuàng)建CheatActivity類

讓CheatActivity 繼承AppCompatActivity, 覆蓋onCreate()方法,將定義在activity_cheat.xml文件中的布局資源ID傳入setContentView()方法,如代碼清單5-3所示。

代碼清單5-3 覆蓋onCreate()方法(CheatActivity.java)

CheatActivity還有更多任務(wù)需要在onCreate()方法中完成。不過(guò)現(xiàn)在我們先進(jìn)入下一環(huán)節(jié),即在應(yīng)用的manifest配置文件中聲明CheatActivity。

5.1.3 在manifest配置文件中聲明activity

manifest配置文件是一個(gè)包含元數(shù)據(jù)的XML文件,用來(lái)向Android操作系統(tǒng)描述應(yīng)用。該文件總是以AndroidManifest.xml命名,可在項(xiàng)目的根目錄找到它。通過(guò)項(xiàng)目導(dǎo)航視圖,在項(xiàng)目的根目錄中找到并打開(kāi)它。

應(yīng)用的所有activity都必須在manifest配置文件中聲明,這樣操作系統(tǒng)才能夠使用它們。

創(chuàng)建QuizActivity時(shí),因使用了新建應(yīng)用向?qū)?#xff0c;向?qū)?huì)自動(dòng)完成聲明工作。而CheatActivity則需手工完成聲明工作。(也可使用向?qū)陆–heatActivity, 同時(shí)自動(dòng)完成聲明工作)

在AndroidManifest.xml配置文件中,完成CheatActivity的聲明,如代碼清單5-4所示。

代碼清單5-4 在manifest配置文件中聲明CheatActivity(AndroidManifest.xml)

這里的android:name屬性是必需的。屬性值前面的“.”可告知OS:在manifest配置文件頭部包屬性值指定的包路徑下,可以找到CheatActivity的類文件。

manifest配置文件里還有很多有趣的東西。不過(guò),我們現(xiàn)在還是先集中精力把CheatActivity配置并運(yùn)行起來(lái)吧。在后續(xù)章節(jié)中,我們還將學(xué)習(xí)到更多有關(guān)manifest配置文件的知識(shí)。

5.1.4 為QuizActivity添加cheat按鈕

按照開(kāi)發(fā)設(shè)想,用戶在QuizActivity用戶界面上點(diǎn)擊某個(gè)按鈕,應(yīng)用立即產(chǎn)生CheatActivity實(shí)例,并顯示其用戶界面。因此,我們需要在layout/activity_quiz.xml以及l(fā)ayout-land/activity_quiz.xml布局文件中定義需要的按鈕。

在默認(rèn)的垂直布局中,添加新按鈕定義并設(shè)置其為根LinearLayout的直接子類。新按鈕應(yīng)該定義在Next按鈕之前,按鈕添加方法如代碼清單5-5所示。

代碼清單5-5 默認(rèn)布局中添加cheat按鈕(layout/activity_quiz.xml)

同樣,修改水平布局文件,將新按鈕定義在根FrameLayout的底部居中位置,如代碼清單5-6所示。

代碼清單5-6 水平布局中添加cheat按鈕(layout-land/activity_quiz.xml)

保存修改后的布局文件。然后重新打開(kāi)QuizActivity.java文件,添加新按鈕變量以及資源引用代碼。最后再添加View.onClickListener監(jiān)聽(tīng)器代碼存根。啟用新按鈕的做法如代碼清單5-7所示。

代碼清單5-7 啟用Cheat按鈕(QuizActivity.java)

準(zhǔn)備工作完成了,下面我們來(lái)學(xué)習(xí)如何啟動(dòng)CheatActivity。

5.2? 啟動(dòng) activity

一個(gè)activity啟動(dòng)另一個(gè)activity最簡(jiǎn)單的方式是使用以下Activity方法:

public void startActivity(Intent intent)

我們可能“會(huì)以為startActivity()方法是一個(gè)類方法,啟動(dòng)activity就是針對(duì)Activity子類調(diào)用該方法。實(shí)際并非如此, activity調(diào)用startActivity()方法時(shí),調(diào)用請(qǐng)求實(shí)際發(fā)給了操作系統(tǒng)。

準(zhǔn)確地說(shuō),該方法調(diào)用請(qǐng)求是發(fā)送給操作系統(tǒng)的ActivityManager。ActivityManager負(fù)責(zé)創(chuàng)建Activity實(shí)例并調(diào)用其onCreate()方法。activity的啟動(dòng)示意圖如圖5-8所示。

圖5-8 啟動(dòng)activity

ActivityManager如何知道該啟動(dòng)哪一個(gè)Activity呢? 答案就在于傳入startActivity()方法的Intent參數(shù)。

基于intent的通信

提示:

Intent代表一個(gè)應(yīng)用"想去做什么事",你可以用它做各種各樣的任務(wù),不過(guò)大部分的時(shí)候他們被用來(lái)啟動(dòng)另一個(gè)Activity。

intent對(duì)象是組件用來(lái)與操作系統(tǒng)通信的一種媒介工具。目前為止,我們唯一見(jiàn)過(guò)的組件(component)就是activity。實(shí)際上還有其他一些component,如service、broadcast receiver以及content provider。

Intent是一種多功能通信工具。Intent類提供了多個(gè)構(gòu)造方法,以滿足不同的使用需求。

在GeoQuiz應(yīng)用中,我們使用intent告知ActivityManager該啟動(dòng)哪一個(gè)activity,因此可使用以下構(gòu)造方法(構(gòu)造一個(gè)Intent對(duì)象):

public Intent(Context packageContext, Class<?> cls)

傳入該方法的Class對(duì)象指定 ActivityManager應(yīng)該啟動(dòng)的activity;Context對(duì)象告知ActivityManager在哪一個(gè)包里可以找到Class對(duì)象,關(guān)系圖如圖5-9所示。

圖5-9 intent:ActivityManager的信使

在mCheatButton的監(jiān)聽(tīng)器代碼中,創(chuàng)建包含CheatActivity類的Intent實(shí)例,然后將其傳入startActivity(Intent)方法。代碼清單5-8中,QuizActivity.this 代表啟動(dòng)方,之所以用this是因?yàn)楫?dāng)前Activity是Context的子類。

代碼清單5-8 啟動(dòng)CheatActivity(QuizActivity.java)

在啟動(dòng)activity前,ActivityManager會(huì)檢查確認(rèn)指定的Class是否已在配置文件中聲明。如已完成聲明,則啟動(dòng)activity,應(yīng)用正常運(yùn)行。反之,則拋出ActivityNotFoundException異常。這就是我們必須在manifest配置文件中聲明應(yīng)用全部activity的原因所在。

顯式與隱式intent

如果通過(guò)指定Context與Class對(duì)象,然后調(diào)用intent的構(gòu)造方法來(lái)創(chuàng)建Intent,則創(chuàng)建的是顯式intent。通常,在同一個(gè)應(yīng)用中,我們使用顯式intent來(lái)啟動(dòng)activity。

同一個(gè)應(yīng)用里的兩個(gè)activity間,通信卻要借助于應(yīng)用外部的ActivityManager,這可能看起來(lái)有點(diǎn)啰嗦。不過(guò),這種模式會(huì)使不同應(yīng)用間的activity交互變得容易很多。

一個(gè)應(yīng)用的activity如需啟動(dòng)另一個(gè)應(yīng)用的activity,可通過(guò)創(chuàng)建隱式intent來(lái)處理。我們會(huì)在第21章學(xué)習(xí)到隱式intent的使用。

運(yùn)行GeoQuiz應(yīng)用。單擊Cheat按鈕,新activity實(shí)例的用戶界面將顯示在屏幕上。單擊后退按鈕,CheatActivity實(shí)例會(huì)被銷毀,繼而返回到QuizActivity實(shí)例的用戶界面中。

5.3? activity 間的數(shù)據(jù)傳遞

既然CheatActivity與QuizActivity都已經(jīng)就緒,接下來(lái)就可以考慮它們之間的數(shù)據(jù)傳遞了。圖5-10展示了兩個(gè)activity間傳遞的數(shù)據(jù)信息。

圖5-10 QuizActivity與CheatActivity間的對(duì)話

CheatActivity啟動(dòng)后,QuizActivity會(huì)將當(dāng)前問(wèn)題的答案通知給它。

用戶知道答案后,單擊后退鍵回到QuizActivity,CheatActivity隨即會(huì)被銷毀。在被銷毀前的瞬間,它會(huì)將用戶是否作弊的數(shù)據(jù)傳遞給QuizActivity。

接下來(lái),我們首先要學(xué)習(xí)如何將數(shù)據(jù)從QuizActivity傳遞到CheatActivity。

5.3.1 使用intent extra

為將當(dāng)前問(wèn)題答案通知給CheatActivity,需將以下語(yǔ)句的返回值傳遞給它:

mQuestionBank[mCurrentIndex].isTrueQuestion();

該值將作為extra信息,附加在傳入startActivity(Intent)方法的Intent上發(fā)送出去。

extra信息可以是任意數(shù)據(jù),它包含在Intent中,由啟動(dòng)方activity發(fā)送出去。接受方activity接收到操作系統(tǒng)轉(zhuǎn)發(fā)的intent后,訪問(wèn)并獲取包含在其中的extra數(shù)據(jù)信息, 其關(guān)系如圖5-11所示。

圖5-11 Intent extra:activity間的通信與數(shù)據(jù)傳遞

如同 QuizActivity.onSaveInstanceState(Bundle) 方法中用 來(lái)保存 mCurrentIndex 值的key-value結(jié)構(gòu),extra也同樣是一種key-value結(jié)構(gòu)。

將extra數(shù)據(jù)信息添加給intent,我們需要調(diào)用Intent.putExtra()方法, 方法原型如下:

public Intent putExtra(String name, boolean value)

Intent.putExtra()方法有多種形式。不變的是,它總是有兩個(gè)參數(shù)。一個(gè)參數(shù)是固定為String類型的key,另一個(gè)參數(shù)值可以是多種數(shù)據(jù)類型。

在CheatActivity.java中,為extra數(shù)據(jù)信息新增key-value對(duì)中的key,如代碼清單5-9所示。

代碼清單5-9 添加extra常量(CheatActivity.java)

activity可能啟動(dòng)自不同的地方,我們應(yīng)該為activity獲取和使用的extra定義一個(gè)key。如代碼清單5-9所示,使用包名來(lái)修飾extra數(shù)據(jù)信息,這樣可以避免來(lái)自不同應(yīng)用的extra間發(fā)生命名沖突。

接下來(lái),再回到QuizActivity,將extra附加到intent上,如代碼清單5-10所示。

代碼清單5-10 將extra附加到intent上(QuizActivity.java)

要從extra獲取數(shù)據(jù),會(huì)用到如下方法:

public boolean getBooleanExtra(String name, boolean defaultValue)

第一個(gè)參數(shù)是extra的名字。getBooleanExtra()方法的第二個(gè)參數(shù)是指定默認(rèn)值(默認(rèn)答案),它在無(wú)法獲得有效key值時(shí)使用。

在CheatActivity代碼中,編寫代碼實(shí)現(xiàn)從extra中獲取信息,然后將信息存入成員變量中,如代碼清單5-11所示。

代碼清單5-11 獲取extra信息(CheatActivity.java)

請(qǐng)注意,Activity.getIntent()方法返回了由startActivity(Intent) 方法轉(zhuǎn)發(fā)的Intent對(duì)象。

最后,在CheatActivity代碼中,編碼實(shí)現(xiàn)單擊“顯示答案”按鈕后可獲取答案并將其顯示在TextView上,如代碼清單5-12所示。

代碼清單5-12 啟用作弊模式(CheatActivity.java)

TextView 相關(guān)的代碼還是很直觀的。可通過(guò)使用 TextView.setText(int) 方法來(lái)設(shè)置TextView要顯示的文字。TextView.setText(int)方法有多種變體。這里,我們通過(guò)傳入資源ID來(lái)調(diào)用該方法。

運(yùn)行GeoQuiz應(yīng)用。單擊Cheat按鈕彈出CheatActivity的用戶界面。然后單擊“顯示答案”按鈕查看當(dāng)前問(wèn)題的答案。

5.3.2 從子activity獲取返回結(jié)果

現(xiàn)在用戶可以毫無(wú)顧忌地偷看答案了。如果CheatActivity可以把用戶是否偷看過(guò)答案的情況通知給QuizAcitivity就更好了。下面我們來(lái)修正這個(gè)問(wèn)題。

若需要從子activity獲取返回信息時(shí),可調(diào)用以下Activity方法:

public void startActivityForResult(Intent intent, int requestCode)

該方法的第一個(gè)參數(shù)同前述的intent。第二個(gè)參數(shù)是請(qǐng)求代碼(是一個(gè)用戶定義的整數(shù))是先發(fā)送給子activity,然后再返回給父activity。當(dāng)一個(gè)activity啟動(dòng)多個(gè)不同類型的子activity,且需要判斷區(qū)分消息回饋方時(shí),我們通常會(huì)用到該請(qǐng)求代碼。

在QuizActivity中,修改mCheatButton的監(jiān)聽(tīng)器,調(diào)用startActivityForResult(Intent, int)方法,如代碼清單5-13所示。

代碼清單5-13 調(diào)用startActivityForResult()方法(QuizActivity.java)

QuizActivity只會(huì)啟動(dòng)一個(gè)類型的子activity。具體發(fā)送信息是什么都無(wú)所謂,因此對(duì)于需要的請(qǐng)求代碼參數(shù),傳入0即可。

1. 設(shè)置返回結(jié)果

實(shí)現(xiàn)子activity發(fā)送返回信息給父activity,有以下兩種方法可供調(diào)用:

public final void setResult(int resultCode)

public final void setResult(int resultCode, Intent data)

通常來(lái)說(shuō),參數(shù)result code可以是以下兩個(gè)預(yù)定義常量中的任何一個(gè):

  • Activity.RESULT_OK
  • Activity.RESULT_CANCELED

(如需自己定義結(jié)果代碼,還可使用另一個(gè)常量:RESULT_FIRST_USER)

在父activity需要依據(jù)子activity的完成結(jié)果采取不同操作時(shí),設(shè)置結(jié)果代碼resultCode很有幫助。

例如,假設(shè)子activity有一個(gè)OK按鈕及一個(gè)Cancel按鈕,并且為每個(gè)按鈕的單擊動(dòng)作分別設(shè)置了不同的結(jié)果代碼。根據(jù)不同的結(jié)果代碼,父activity會(huì)采取不同的操作。

子activity可以不調(diào)用setResult()方法。如不需要區(qū)分附加在intent上的結(jié)果或其他信息,可讓操作系統(tǒng)發(fā)送默認(rèn)的結(jié)果代碼。

如果子activity是以調(diào)用startActivityForResult()方法啟動(dòng)的,結(jié)果代碼則總是會(huì)返回給父activity。在沒(méi)有調(diào)用setResult()方法的情況下,如果用戶單擊了后退按鈕,父activity則會(huì)收到Activity.RESULT_CANCELED的結(jié)果代碼。

2. 返還intent

GeoQuiz應(yīng)用中,數(shù)據(jù)信息需要回傳給QuizActivity。因此,我們需要?jiǎng)?chuàng)建一個(gè)Intent,附加上extra信息后,調(diào)用Activity.setResult(int, Intent)方法將信息回傳給QuizActivity。

前面,我們已經(jīng)為CheatActivity接收的extra定義了常量。CheatActivity要回傳信息給QuizActivity,我們同樣需要為回傳的extra做類似的定義。

為什么不在接收信息的父activity中定義extra常量呢?這是因?yàn)?#xff0c;傳入及傳出extra針對(duì)CheatActivity定義了統(tǒng)一的接口。這樣,如果在應(yīng)用的其他地方使用CheatActivity,我們只需要關(guān)注和使用定義在CheatActivity中的那些常量。

在CheatActivity代碼中,為extra增加常量key,再創(chuàng)建一個(gè)私有方法,用來(lái)創(chuàng)建intent,附加extra并設(shè)置結(jié)果值。然后在Show Answer按鈕的監(jiān)聽(tīng)器代碼中調(diào)用該方法。設(shè)置結(jié)果值的方法如代碼清單5-14所示。

代碼清單5-14 設(shè)置結(jié)果值(CheatActivity.java)

用戶單擊“顯示答案”按鈕時(shí),CheatActivity調(diào)用setResult(int, Intent)方法將結(jié)果代碼以及intent打包。

然后,在用戶單擊后退鍵回到QuizActivity時(shí),ActivityManager調(diào)用父activity的以下方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data)

該方法的參數(shù)來(lái)自于QuizActivity的原始請(qǐng)求代碼以及傳入SetResult()方法的結(jié)果代碼和intent。圖5-12展示了應(yīng)用內(nèi)部的交互時(shí)序。

圖5-12 GeoQuiz應(yīng)用內(nèi)部的交互時(shí)序圖

最后覆蓋QuizActivity的onActivityResult(int, int, Intent)方法來(lái)處理返回結(jié)果。

3. 處理返回結(jié)果

在 QuizActivity.java 中,新增一個(gè)成員變量保存 CheatActivity 回傳的值。然后覆蓋onActivityResult()方法獲取它。onActivityResult()方法的實(shí)現(xiàn)如代碼清單5-15所示。

代碼清單5-15 onActivityResult()方法的實(shí)現(xiàn)(QuizActivity.java)

觀察onActivityResult()方法的實(shí)現(xiàn)代碼,我們發(fā)現(xiàn),QuizActivity并不關(guān)心請(qǐng)求代碼或結(jié)果代碼是什么。不過(guò),在其他情況下,某些條件判斷編碼會(huì)使用到這些代碼值。

最后,修改QuizActivity中的checkAnswer(boolean)方法,確認(rèn)用戶是否偷看答案并給出相應(yīng)的反應(yīng)。基于mIsCheater變量值改變toast消息的做法如代碼清單5-16所示。

代碼清單5-16 基于mIsCheater變量值改變toast消息(QuizActivity.java)

運(yùn)行GeoQuiz應(yīng)用。偷看下答案,看看會(huì)發(fā)生什么。

5.4? activity 的使用與管理

來(lái)看看當(dāng)我們?cè)诟鱝ctivity間往返的時(shí)候,操作系統(tǒng)層面到底發(fā)生了什么。首先,在桌面啟動(dòng)器中點(diǎn)擊GeoQuiz應(yīng)用時(shí),操作系統(tǒng)并沒(méi)有啟動(dòng)應(yīng)用,而只是啟動(dòng)了應(yīng)用中的一個(gè)activity。確切地說(shuō),它啟動(dòng)了應(yīng)用的launcher activity。在GeoQuiz應(yīng)用中,QuizActivity就是它的launcher activity。

使用應(yīng)用向?qū)?chuàng)建GeoQuiz應(yīng)用以及QuizActivity時(shí),QuizActivity默認(rèn)被設(shè)置為launcher activity。

在配置文件中,QuizActivity聲明的intent-filter元素節(jié)點(diǎn)下,可看到QuizActivity被指定為launcher activity,如代碼清單5-17所示。

代碼清單5-17 QuizActivity被指定為launcher activity(AndroidManifest.xml)

QuizActivity 實(shí)例出現(xiàn)在屏幕上后,用戶可單擊 Cheat!按鈕。CheatActivity 實(shí)例在QuizActivity實(shí)例上被啟動(dòng)。此時(shí),它們都處于activity棧中,如圖5-13所示。

圖5-13 GeoQuiz的回退棧

單擊后退鍵,CheatActivity實(shí)例被彈出棧外,QuizActivity重新回到棧頂部,如圖5-13所示。

轉(zhuǎn)載于:https://www.cnblogs.com/jlxuqiang/p/4750034.html

總結(jié)

以上是生活随笔為你收集整理的第 5 章 第二个 activity的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。