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

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

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

圖2-10 帶有返回結(jié)果的跳轉(zhuǎn)運行結(jié)果(左:ReceiveResult;中:SendResult;右:ReceiveResult)
初始化界面如圖2-10中左圖所示,單擊“Get Result”按鈕將跳轉(zhuǎn)到第二個屏幕,如圖2-10中的中圖所示;在第二個屏幕中單擊“Corky”和“Violet”按鈕將返回第一個屏幕,如圖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è)置一個GET_CODE為請求代碼,這樣可以獲得目標活動的返回信息。這個方法的原型為:
public void startActivityForResult (Intent intent, int requestCode)
被跳轉(zhuǎn)的目標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)的目標程序?qū)⒎祷刂捣祷兀@里使用的依然是Intent作為交互的信息,通過setAction()設(shè)置不同的活動。
由于被跳轉(zhuǎn)的目標程序是被顯示Intent調(diào)用起來的,因此,返回后繼續(xù)由ReceiveResult.java對返回值進行處理。返回的信息通過重新實現(xiàn)Activity的onActivityResult()方法來實現(xiàn),兩個整數(shù)類型的參數(shù)requestCode和resultCode分別代表請求代碼和結(jié)果碼,第三個參數(shù)Intent(類型data)表示活動間交互附加的數(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è)置返回數(shù)據(jù)的動作 } } text.append("\n"); } }
這里onActivityResult()是一個被繼承的方法,其參數(shù)data就是這個活動接收到的返回結(jié)果,data.getAction()可以從返回的Intent中取回內(nèi)容。
參數(shù)requestCode對應于調(diào)用startActivityForResult()的時候啟動活動時指定的申請碼。其作用在于,一個活動啟動了多個活動的時候,根據(jù)這個requestCode可以區(qū)分是哪一個活動返回了。參數(shù)resultCode比較特殊,當把啟動的程序自己返回的時候,這個數(shù)值可以由被啟動的程序設(shè)置。如果被啟動的程序被使用回退按鍵返回,那么這個數(shù)值將為RESULT_CANCELED(0)。
對于resultCode,雖然其類型是整型,但是由于它有幾個默認值(Activity類中定義的-1,0,1)用于處理特殊情況,因此,如果用其表示自定義的結(jié)果,它只能表示枚舉類型,不足以表示整數(shù)類型的數(shù)據(jù)(會和特殊情況有沖突)。更多的返回結(jié)果,應該通過Intent來表示。
- 信息光學原理
- 可見光通信光源與探測器件原理及應用
- 創(chuàng)客電子入門
- 從算法到電路:數(shù)字芯片算法的電路實現(xiàn)
- Cadence Allegro 17.4電子設(shè)計速成實戰(zhàn)寶典
- 精通Android 5 多媒體開發(fā)
- 21堂課精通電子元器件檢測
- 電子裝配工藝實訓:項目教程
- 5G產(chǎn)業(yè):新智能時代革命
- 4G核心網(wǎng)絡(luò)規(guī)劃與設(shè)計
- 通信專業(yè)綜合能力與實務:互聯(lián)網(wǎng)技術(shù)
- Protel 99 SE實戰(zhàn)100例
- 電視機檢修技能零基礎(chǔ)成長
- 微信小程序?qū)崙?zhàn)入門(第2版)
- 全程圖解電子元器件檢測技能