1. 程式人生 > 其它 >Android 子activity關閉 向父activity傳值

Android 子activity關閉 向父activity傳值

使用startActivity方式啟動的Activity和它的父Activity無關,當它關閉時也不會提供任何反饋。

可變通的,你可以啟動一個Activity作為子Activity,它與父Activity有內在的聯絡。當子Activity關閉時,它會觸發父Activity中的一個事件處理函式。子Activity最適合用在一個Activity為其它的Activity提供資料(例如使用者從一個列表中選擇一個專案)的場合。

子Activity的建立和普通Activity的建立相同,也必須在應用程式的manifest中註冊。任何在manifest中註冊的Activity都可以用作子Activity。

啟動子Activity

startActivityForResult方法和startActivity方法工作很相似,但有一個很重要的差異。Intent都是用來決定啟動哪個Activity,你還可以傳入一個請求碼。這個值將在後面用來作為有返回值Activity的唯一ID。

下面的程式碼顯示瞭如何啟動一個子Activity:

private static final int SHOW_SUBACTIVITY = 1;
Intent intent = new Intent(this, MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);

和正常的Activity一樣,子Activity可以隱式或顯式啟動。下面的框架程式碼使用一個隱式的Intent來啟動一個新的子Activity來挑選一個聯絡人:

private static final int PICK_CONTACT_SUBACTIVITY = 2;
Uri uri = Uri.parse(“content://contacts/people”);
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);

返回值

當子Activity準備關閉時,在finish之前呼叫setResult來給呼叫的Activity返回一個結果。

setResult方法帶兩個引數:結果碼和表示為Intent的負載值。結果碼是執行子Activity的結果,一般是Activity.RESULT_OK或Activity.RESULT_CANCELED。在一些情況下,你會希望使用自己的響應代號來處理特定的應用程式的選擇;setResult支援任何整數值。

作為結果返回的Intent可以包含指向一個內容(例如聯絡人,電話號碼或媒體檔案)的URI和一組用來返回額外資訊的Extra。

接下來的程式碼片段節選自子Activity的onCreate方法,顯示了怎樣向呼叫的Activity返回不同的結果:

Button okButton = (Button) findViewById(R.id.ok_button);
okButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view)
{
Uri data = Uri.parse(“content://horses/” + selected_horse_id);
Intent result = new Intent(null, data);
result.putExtra(IS_INPUT_CORRECT, inputCorrect);
result.putExtra(SELECTED_PISTOL, selectedPistol);
setResult(RESULT_OK, result);
finish();
}
});
Button cancelButton = (Button) findViewById(R.id.cancel_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view)
{
setResult(RESULT_CANCELED, null);
finish();
}
});

處理子Activity的結果

當子Activity關閉時,它的父Activity的onActivityResult事件處理函式被觸發。

重寫這個方法來處理從子Activity返回的結果。onActivityResult處理器接受好幾個引數:

❑ 請求碼

曾經用來啟動子Activity的請求碼。

❑ 結果碼

結果碼是由子Activity設定的,用來顯示它的結果。它可以是任何整數值,但典型的值是Activity.RESULT_OK和Activity.RESULT_CANCELLED。

如果子Activity非正常關閉或在關閉時沒有指定結果碼,結果碼都是Activity.RESULT_CANCELED。

❑ 資料

一個Intent來打包任何返回的資料。依賴於子Activity的目的,它可能會包含一個代表特殊的從列表中選擇的資料的URI。可變通的,或額外的,子Activity可以使用“extras”機制以基礎值的方式返回臨時資訊。

下面的框架程式碼實現了一個Activity中的onActivityResult事件處理函式:

private static final int SHOW_SUB_ACTIVITY_ONE = 1;
private static final int SHOW_SUB_ACTIVITY_TWO = 2;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{
case (SHOW_SUB_ACTIVITY_ONE) :
{
if (resultCode == Activity.RESULT_OK)
{
Uri horse = data.getData();
boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);
String selectedPistol = data.getStringExtra(SELECTED_PISTOL);
}
break;
}
case (SHOW_SUB_ACTIVITY_TWO) :
{
if (resultCode == Activity.RESULT_OK)
{
// TODO: Handle OK click.
}
break;
}
}
}