書名: Android經(jīng)典應(yīng)用程序開發(fā)作者名: 韓超編著本章字?jǐn)?shù): 699字更新時(shí)間: 2019-01-09 15:18:47
2.4 屏幕切換
在一般情況下,Android的每一個(gè)屏幕基本上是一個(gè)活動(dòng)(Activity),屏幕之間的切換實(shí)際上就是在活動(dòng)間互相調(diào)用的過程,在程序中通過使用Intent完成屏幕跳轉(zhuǎn)的動(dòng)作。
Android屏幕跳轉(zhuǎn)的關(guān)系和方式如圖2-8所示。

圖2-8 屏幕跳轉(zhuǎn)的關(guān)系和方式
從程序的角度,屏幕之間“切換”的過程實(shí)際上是一個(gè)屏幕啟動(dòng)了另外一個(gè)屏幕。從一個(gè)Activity啟動(dòng)另外一個(gè)Activity的結(jié)果是“跳轉(zhuǎn)”,也就是“屏幕的切換”。在Android中有如下兩種類型的跳轉(zhuǎn)。
startActivity():簡單啟動(dòng)一個(gè)屏幕;
startActivityForResult():以帶有返回結(jié)果的方式啟動(dòng)一個(gè)屏幕。
另外一個(gè)方面,如果A屏幕(活動(dòng))啟動(dòng)B屏幕之后,自己退出,那么這將是一個(gè)沒有返回的跳轉(zhuǎn);如果A屏幕啟動(dòng)B之后,自己沒有退出,那么B退出的時(shí)候可能又返回到A,這就是一個(gè)可返回的跳轉(zhuǎn)。顯然,只有在啟動(dòng)者沒有退出的情況下,才有返回結(jié)果接收的問題。
2.4.1 啟動(dòng)活動(dòng)的方法
Activity等類繼承自Context,Context中的startActivity()方法用于啟動(dòng)一個(gè)簡單的活動(dòng),如下所示:
public void startActivity (Intent intent)
Intent用于傳遞兩個(gè)屏幕之間的信息,實(shí)現(xiàn)屏幕的跳轉(zhuǎn)功能。調(diào)用者可以通過Intent傳遞參數(shù),也可以獲得跳轉(zhuǎn)對(duì)象的返回信息。Android中的各個(gè)屏幕一般是對(duì)等的,具有啟動(dòng)關(guān)系的兩個(gè)屏幕沒有運(yùn)行時(shí)的依賴關(guān)系。
本示例是一個(gè)簡單的屏幕之間的跳轉(zhuǎn),從一個(gè)屏幕跳轉(zhuǎn)到另一個(gè)屏幕,在啟動(dòng)第二個(gè)屏幕后,前一個(gè)屏幕消失。
示例程序:Forward(ApiDemo=>App=>Activity=>Forward)
源代碼:
com/example/android/apis/app/Forward.java com/example/android/apis/app/ForwardTarget.java
本示例包含了兩個(gè)活動(dòng),在UI上它們就是兩個(gè)屏幕,分別為跳轉(zhuǎn)的源和目的,它們在AndroidManifest.xml中的定義如下所示。
<activity android:name=".app.Forwarding" android:label="@string/activity_forward ding"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> </activity> <activity android:name=".app.ForwardTarget"> </activity>
兩個(gè)活動(dòng)的名稱分別為Forwarding和ForwardTarget,由于第二個(gè)活動(dòng)沒有intent-filter,因此在程序中只能由第一個(gè)活動(dòng)來啟動(dòng)。
Forwarding程序的運(yùn)行結(jié)果如圖2-9所示。

圖2-9 活動(dòng)的跳轉(zhuǎn)程序運(yùn)行結(jié)果(左Forward;右ForwardTarget)
在第一個(gè)活動(dòng)(Forwarding)啟動(dòng)后,單擊“Go”按鈕跳轉(zhuǎn)到第二個(gè)活動(dòng)(ForwardTarget)。第二個(gè)活動(dòng)退出后,不會(huì)返回到第一個(gè)活動(dòng)。
跳轉(zhuǎn)的核心內(nèi)容在Java源文件Forward.java的以下片段中處理:
public void onClick(View v) { Intent intent = new Intent(); // 建立Intent intent.setClass(Forwarding.this, ForwardTarget.class);//在Intent中設(shè)置活動(dòng)目標(biāo) startActivity(intent); finish(); // 結(jié)束當(dāng)前活動(dòng) }
啟動(dòng)第二個(gè)活動(dòng)需要使用Intent,在其setClass()方法中設(shè)置源和返回的內(nèi)容,Intent是android.content包中的類,用于啟動(dòng)活動(dòng)、服務(wù)或者消息接收器。
這里使用的Intent的setClass()方法的原型如下所示:
Intent setClass(Context packageContext, Class<?> cls)
第一個(gè)參數(shù)是當(dāng)前的上下文類型Context,因此把當(dāng)前的活動(dòng)設(shè)置過去即可(Activity本身繼承了Context),第二個(gè)參數(shù)是Intent所包含的Java類,直接設(shè)置ForwardTarget.class類即可。
本例中使用了finish()方法表示當(dāng)前的活動(dòng)結(jié)束,這樣在第二個(gè)活動(dòng)(ForwardTarget)啟動(dòng)時(shí),第一個(gè)活動(dòng)(Forward)已經(jīng)不存在了。如果沒有調(diào)用finish()方法,第二個(gè)活動(dòng)啟動(dòng)時(shí),第一個(gè)活動(dòng)就會(huì)進(jìn)入停止?fàn)顟B(tài),onPause()和onStop()方法將被接連調(diào)用。當(dāng)?shù)诙€(gè)活動(dòng)退出后,第一個(gè)活動(dòng)重新出現(xiàn),也就是會(huì)調(diào)用其中的onStart()和onResume()方法。
2.4.2 帶有返回結(jié)果的啟動(dòng)活動(dòng)
在某些時(shí)候,從跳轉(zhuǎn)的對(duì)象返回時(shí),跳轉(zhuǎn)源屏幕需要得到其返回的結(jié)果,這樣兩個(gè)屏幕可實(shí)現(xiàn)一些交互的效果。
Activity中的以下幾個(gè)方法運(yùn)動(dòng)啟動(dòng)帶有返回結(jié)果的跳轉(zhuǎn),如下所示:
public void startActivityForResult (Intent intent, int requestCode) public void finishActivity(int requestCode) protected void onActivityResult (int requestCode, int resultCode, Intent data)
startActivityForResult()可以取得返回結(jié)果的活動(dòng)啟動(dòng)方法;finishActivity()用于結(jié)束一個(gè)使用startActivityForResult()啟動(dòng)的活動(dòng);onActivityResult()用于接收被啟動(dòng)的Activity返回的結(jié)果。
提示:上述幾個(gè)方法只能在Activity中使用,啟動(dòng)者和被啟動(dòng)者之間有所關(guān)聯(lián)。
一個(gè)被以startActivityForResult()方式啟動(dòng)的活動(dòng),可以使用setResut()方法設(shè)置內(nèi)容給其啟動(dòng)者:
public void setResut(int resultCode, Intent intent)
按照這種模式,在Activity的啟動(dòng)者和被啟動(dòng)者之間,進(jìn)行傳遞的數(shù)據(jù)有如下4個(gè)。
啟動(dòng)Intent:由啟動(dòng)者傳遞給被啟動(dòng)者,含義和沒有返回結(jié)果的啟動(dòng)相同;
請(qǐng)求碼(int類型):由啟動(dòng)者傳遞給自己;
返回碼(int類型):由被啟動(dòng)者傳遞給啟動(dòng)者;
返回?cái)?shù)據(jù)(Intent類型):由被啟動(dòng)者傳遞給啟動(dòng)者。
后三個(gè)也就是啟動(dòng)者的onActivityResult()中所接收的三個(gè)參數(shù),其中返回碼有以下的Activity類的幾個(gè)默認(rèn)數(shù)值:
public static final int RESULT_OK // -1 public static final int RESULT_FIRST_USER // 0 public static final int RESULT_CANCELED // 1
以下程序用于一個(gè)帶有返回結(jié)果的活動(dòng)。
參考示例程序:ReceiveResult(ApiDemo => App=>Activity=>ReceiveResult)
源代碼:
com/example/android/apis/app/ReceiveResult.java com/example/android/apis/app/SendResult.java
ReceiveResult程序的運(yùn)行結(jié)果如圖2-10所示。

圖2-10 帶有返回結(jié)果的跳轉(zhuǎn)運(yùn)行結(jié)果(左:ReceiveResult;中:SendResult;右:ReceiveResult)
初始化界面如圖2-10中左圖所示,單擊“Get Result”按鈕將跳轉(zhuǎn)到第二個(gè)屏幕,如圖2-10中的中圖所示;在第二個(gè)屏幕中單擊“Corky”和“Violet”按鈕將返回第一個(gè)屏幕,如圖2-10中的右圖所示。右圖中顯示的也就是返回結(jié)果的內(nèi)容。
Java源文件ReceiveResult.java的代碼片段如下所示:
static final private int GET_CODE = 0; private OnClickListener mGetListener = new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(ReceiveResult.this, SendResult.class); startActivityForResult (intent, GET_CODE); // 帶有返回結(jié)果的跳轉(zhuǎn) } };
這里調(diào)用的是startActivityForResult()方法,設(shè)置一個(gè)GET_CODE為請(qǐng)求代碼,這樣可以獲得目標(biāo)活動(dòng)的返回信息。這個(gè)方法的原型為:
public void startActivityForResult (Intent intent, int requestCode)
被跳轉(zhuǎn)的目標(biāo)Java源文件SendResult.java的代碼片段如下所示:
private OnClickListener mCorkyListener = new OnClickListener() { public void onClick(View v) { setResult(RESULT_OK,(new Intent()).setAction("Corky!"));// 設(shè)置返回結(jié)果 finish(); // 結(jié)束SendResult } }; private OnClickListener mVioletListener = new OnClickListener() { public void onClick(View v) { setResult(RESULT_OK,(new Intent()).setAction("Violet!"));// 設(shè)置返回結(jié)果 finish(); // 結(jié)束SendResult } };
被跳轉(zhuǎn)的目標(biāo)程序?qū)⒎祷刂捣祷兀@里使用的依然是Intent作為交互的信息,通過setAction()設(shè)置不同的活動(dòng)。
由于被跳轉(zhuǎn)的目標(biāo)程序是被顯示Intent調(diào)用起來的,因此,返回后繼續(xù)由ReceiveResult.java對(duì)返回值進(jìn)行處理。返回的信息通過重新實(shí)現(xiàn)Activity的onActivityResult()方法來實(shí)現(xiàn),兩個(gè)整數(shù)類型的參數(shù)requestCode和resultCode分別代表請(qǐng)求代碼和結(jié)果碼,第三個(gè)參數(shù)Intent(類型data)表示活動(dòng)間交互附加的數(shù)據(jù)信息。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == GET_CODE) { Editable text = (Editable)mResults.getText(); if (resultCode == RESULT_CANCELED) { // 處理程序使用回退按鍵返回的情況 text.append("(cancelled)"); } else { // 處理程序使用setResut()返回的情況 text.append("(okay "); text.append(Integer.toString(resultCode)); text.append(") "); if (data != null) { text.append(data.getAction()); // 將設(shè)置返回?cái)?shù)據(jù)的動(dòng)作 } } text.append("\n"); } }
這里onActivityResult()是一個(gè)被繼承的方法,其參數(shù)data就是這個(gè)活動(dòng)接收到的返回結(jié)果,data.getAction()可以從返回的Intent中取回內(nèi)容。
參數(shù)requestCode對(duì)應(yīng)于調(diào)用startActivityForResult()的時(shí)候啟動(dòng)活動(dòng)時(shí)指定的申請(qǐng)碼。其作用在于,一個(gè)活動(dòng)啟動(dòng)了多個(gè)活動(dòng)的時(shí)候,根據(jù)這個(gè)requestCode可以區(qū)分是哪一個(gè)活動(dòng)返回了。參數(shù)resultCode比較特殊,當(dāng)把啟動(dòng)的程序自己返回的時(shí)候,這個(gè)數(shù)值可以由被啟動(dòng)的程序設(shè)置。如果被啟動(dòng)的程序被使用回退按鍵返回,那么這個(gè)數(shù)值將為RESULT_CANCELED(0)。
對(duì)于resultCode,雖然其類型是整型,但是由于它有幾個(gè)默認(rèn)值(Activity類中定義的-1,0,1)用于處理特殊情況,因此,如果用其表示自定義的結(jié)果,它只能表示枚舉類型,不足以表示整數(shù)類型的數(shù)據(jù)(會(huì)和特殊情況有沖突)。更多的返回結(jié)果,應(yīng)該通過Intent來表示。
- 構(gòu)建運(yùn)營級(jí)LTE網(wǎng)絡(luò)
- 信息光學(xué)原理
- Photoshop移動(dòng)UI設(shè)計(jì)完全實(shí)例教程
- 鴻蒙原生應(yīng)用開發(fā):ArkTS語言快速上手
- Android音視頻開發(fā)
- 步步圖解電子元器件應(yīng)用與檢測技能
- 智慧城市:城市品質(zhì)新思維
- 半導(dǎo)體光電子學(xué)
- 反相對(duì)稱-擴(kuò)頻通信系統(tǒng)抗噪聲性能研究
- 高速設(shè)計(jì)技術(shù)
- 路由器/交換機(jī)項(xiàng)目實(shí)訓(xùn)教程
- 光傳送網(wǎng)(OTN)技術(shù)的原理與測試
- 通信那些事兒(上冊)
- 電子工程師必備:元器件應(yīng)用寶典(強(qiáng)化版)
- BREW進(jìn)階與精通