web-dev-qa-db-ja.com

複数のアクティビティを通じて結果を返す方法

私のアプリケーションの一部には、次のようなアクティビティの構造があります。

enter image description here

Activity Aは、各プロセスまたはフローの後に戻ってくるホームアクティビティです。
Activity Bは単純な確認アクティビティです。
Activity Cは、別の確認アクティビティです。
Activity Dはいくつかのプロセスを実行し、最終的に結果を私のホームアクティビティ(Activity A)に戻します。

要件:

Activity BおよびC

  • 存在する必要があり、1つにマージすることはできません。
  • キャンセルボタンをクリックすると、finish()が呼び出され、何も実行されません。
  • [OK]ボタンをクリックすると、フローに従い、現在のアクティビティがfinish()を呼び出します

質問:

startActivityForResult()の使用を考えていましたが、複数のアクティビティを介して結果を渡すためにこれを使用したことはありません。
また、_handlerActivity Aで作成)を渡して、Activity Aでいくつかのメソッドを呼び出し、Activity Dで実行することも考えていました...

どのように実装できますか?

47
jalv1039

インテントフラグFLAG_ACTIVITY_FORWARD_RESULTを使用したい場合があります Intent アクティビティBおよびCを開始するとき

public static final int FLAG_ACTIVITY_FORWARD_RESULT

以降:APIレベル1

設定され、このインテントが既存のアクティビティから新しいアクティビティを起動するために使用されている場合、既存のアクティビティの返信ターゲットは新しいアクティビティに転送されます。このようにして、新しいアクティビティはsetResult(int)を呼び出し、その結果を元のアクティビティの返信ターゲットに送り返すことができます。

そうすれば、AはDから送り返されたエクストラで送り返されたデータをすべて受け取るはずです。

60
NickT

うん、素晴らしいフォーマット。また、アクティビティA、B、Cのそれぞれから確実にstartActivityForResult()を呼び出すことができます(おそらくそうする必要があります)(すぐにfinish()を呼び出さないでください)。 BとCでは、成功した結果とfinish()を確認して、結果をAに返します。

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if((resultCode == RESULT_OK) && (requestCode == MY_RESULT_CODE)) {
        setResult(RESULT_OK, data);
        finish();
    }
}

関係なくBとCを消したい場合は、代わりに次のようにします。

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    setResult(resultCode, data);
    finish();
}
10
Brian Dupuis

私はこれが本当に古い質問であることを知っていますが、有効な解決策を取り入れ、onNewIntent()を使用してonActivityResult()として扱いたいと思っていました。

アクティビティDでは、意図を次のように構成します

Intent intent = new Intent(yourContext, Activity_A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("someName", data);
startActivity(intent);
finish();

その後、Activity_A

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // update your UI
    intent.getSerializableExtra(...
}
0
Patrick Maroney