88

A、B、C、Dの4つのアクティビティがあります。私の状況では、AはstartActivityForResultによってアクティビティBを開始します。

startActivityForResult(new Intent(this,B.class),ONE);

他の状況では、私は他の状況でBになります。お気に入り

 startActivityForResult(new Intent(this,B.class),TWO);

Bでは、requestCodeに応じてCまたはDを呼び出す必要があります。つまり、ONEがC else Dを開始する必要がある場合。
したがって、子アクティビティ(ここではB)のrequestCodeを確認する方法を知る必要があります。
つまり、アクティビティBが開始されたリクエストコードを取得したいと思います。

4

4 に答える 4

29

リクエストコードは、この値を知る必要がない(そして知る必要がない)ため、開始されたアクティビティに自動的に渡されません。何をすべきかを知る必要があるだけで、どこから始めたのかを知る必要はありません。

アクティビティの開始は、実際にはメソッドを呼び出す別の形式です。メソッドを呼び出すと、結果が同期的に受信されます(呼び出しを行った場所で)。この場合、メソッドがその作業を行うために必要な情報のみを渡します。どこから呼んだのかはわかりません。

アクティビティの開始は、メソッドの呼び出しの非同期アナログです。この場合、特別なメソッドonActivityResult()で結果を受け取ります。この方法では、受け取ったばかりの結果をどう処理するかを知る必要があり、このためのリクエストコードがあります。

リクエストコードをパラメータとして渡すのが得策ではない理由をもう少し明確にするために、購入できる商品を示しているアクティビティの例を考えてみましょう。このアクティビティには、「購入」と「ログイン」というラベルの付いた2つのボタンがあります(現在ログインしていないため)。「ログイン」を押すと、「ログイン」という名前のアクティビティが開始され、提供された情報を使用してユーザーにログインしようとします。「購入」を押すと、最初にまったく同じ「ログイン」アクティビティが開始され、ログインが成功した場合は、購入アクティビティが開始されます。

現在、[ログイン]ボタンはリクエストコード1を使用してログインアクティビティを開始しますが、[購入]ボタンは、ログインが成功した場合に別の処理を行う必要があるため、同じリクエストコードを使用できません。したがって、「購入」ボタンはリクエストコード2を使用します。

「ログイン」アクティビティでは、呼び出し元によって2つの異なるリクエストコードを受け取る場合がありますが、まったく同じ手順を実行する必要があります。

したがって、リクエストコードをパラメータとして渡すと、次のような2つの異なるリクエストコードに対して同じことを行う必要があるコードになります。

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

また、RequestCodesという名前のクラスなど、中央の場所に要求コード定数を格納することになります。

つまり、リクエストコードは、受け取った結果をどう処理するかを決定するためにのみ使用する必要があります。このようにして、よりモジュール化され、保守が容易になり、コードを拡張しやすくなります。

于 2011-10-04T12:59:35.320 に答える
13

最終的に、カスタム インテント アクションを使用して、この種の情報を起動アクティビティに渡しました。

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

次に、次のようになります。

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

アクティビティBでは、アクションを簡単に取得できます。

getIntent().getAction();
于 2015-06-30T11:05:32.987 に答える