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

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

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

圖2-10 帶有返回結果的跳轉運行結果(左:ReceiveResult;中:SendResult;右:ReceiveResult)
初始化界面如圖2-10中左圖所示,單擊“Get Result”按鈕將跳轉到第二個屏幕,如圖2-10中的中圖所示;在第二個屏幕中單擊“Corky”和“Violet”按鈕將返回第一個屏幕,如圖2-10中的右圖所示。右圖中顯示的也就是返回結果的內容。
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); // 帶有返回結果的跳轉 } };
這里調用的是startActivityForResult()方法,設置一個GET_CODE為請求代碼,這樣可以獲得目標活動的返回信息。這個方法的原型為:
public void startActivityForResult (Intent intent, int requestCode)
被跳轉的目標Java源文件SendResult.java的代碼片段如下所示:
private OnClickListener mCorkyListener = new OnClickListener() { public void onClick(View v) { setResult(RESULT_OK,(new Intent()).setAction("Corky!"));// 設置返回結果 finish(); // 結束SendResult } }; private OnClickListener mVioletListener = new OnClickListener() { public void onClick(View v) { setResult(RESULT_OK,(new Intent()).setAction("Violet!"));// 設置返回結果 finish(); // 結束SendResult } };
被跳轉的目標程序將返回值返回,這里使用的依然是Intent作為交互的信息,通過setAction()設置不同的活動。
由于被跳轉的目標程序是被顯示Intent調用起來的,因此,返回后繼續(xù)由ReceiveResult.java對返回值進行處理。返回的信息通過重新實現Activity的onActivityResult()方法來實現,兩個整數類型的參數requestCode和resultCode分別代表請求代碼和結果碼,第三個參數Intent(類型data)表示活動間交互附加的數據信息。
@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()); // 將設置返回數據的動作 } } text.append("\n"); } }
這里onActivityResult()是一個被繼承的方法,其參數data就是這個活動接收到的返回結果,data.getAction()可以從返回的Intent中取回內容。
參數requestCode對應于調用startActivityForResult()的時候啟動活動時指定的申請碼。其作用在于,一個活動啟動了多個活動的時候,根據這個requestCode可以區(qū)分是哪一個活動返回了。參數resultCode比較特殊,當把啟動的程序自己返回的時候,這個數值可以由被啟動的程序設置。如果被啟動的程序被使用回退按鍵返回,那么這個數值將為RESULT_CANCELED(0)。
對于resultCode,雖然其類型是整型,但是由于它有幾個默認值(Activity類中定義的-1,0,1)用于處理特殊情況,因此,如果用其表示自定義的結果,它只能表示枚舉類型,不足以表示整數類型的數據(會和特殊情況有沖突)。更多的返回結果,應該通過Intent來表示。