2013-08-14 7 views
8

バック前のアクティビティに行く私はこの遷移を持つアプリケーションを有する:Android-異なるIntent値

A -> B -> C -> D-> C 

C入ると、私はフラグをチェックしなければなりません。それから私はそれを意図として(intentX = falseと言う)Dに渡さなければなりません。 Dで何かをした後、ボタンを押した後にCに戻ります。 私は何をしたのですか?intentXを値trueにしてから、再度startActivity Cを渡してしまいました。 それで別のアクティビティCが作成されました。

私は新しいアクティビティCを開始する必要はありませんが、前のCを使用してsuper.onBackPressed()を呼び出すだけです。しかし、私はintentXの新しい価値を渡すことはできません。私が望むものを達成するために、他の方法がありますか?私はいくつかを逃したかもしれない。

答えて

13

希望するものはstartActivityForResult()です。 CからDに移動するときは、startActivity()を使用する代わりにstartActivityForResult()を使用してください。その後、DからCに戻る場合はIntentオブジェクトを含むsetResult()オブジェクトを使用し、extrasを返してCに渡します。

onBackPressed()に入力しないでください。にはがありますが、これはユーザーが期待するものではないためです。代わりに、Buttonクリックなどのイベントでこのデータを返す必要があります。あなたは

Intent i = new Intent(); 
i.putExtra(); // insert your extras here 
setResult(0, i); 

を返しする準備ができたら、あなたがCに戻ったとき、あなたは、このメソッド(taken from the Docs)を入力しますDで、その後

Intent i = new Intent(new Intent(C.this, D.class); 
startActivityForResult(i, 0); 

ようなことを行いますCにそう

protected void onActivityResult(int requestCode, int resultCode, 
     Intent data) { 
    if (requestCode == PICK_CONTACT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
      // A contact was picked. Here we will just display it 
      // to the user. 
      startActivity(new Intent(Intent.ACTION_VIEW, data)); 

      /* 
       can also get the extra sent back through data 
       using data.getStringExtra("someKey"); 
       assuming the extra was a String 
      */ 

     } 
+0

ああ、もう一度試してみる必要があります。私は前に間違った方法で使用しているに違いない。 – sftdev

+0

これは可能です。最初はどのように動作するかを理解するまで、混乱しやすいです。これは、あなたを始めさせるのには十分であるはずですが、私がリンクしているドキュメントや、GoogleやSOのチュートリアルや例にもまともな例があります。 – codeMagic

+0

結果を設定した後、 "返す準備ができました" ?私は 'finish()'と呼ぶべきでしょうか? –

1

startActivityForResultが本当に必要でないか、startActivityForResultのすべてのstartActivity呼び出しを変更することが現実的でない場合があります。

以前のアクティビティ 'again'を開始するだけの単純なケースが必要な場合は、次のようにします。FLAG_ACTIVITY_CLEAR_TOPフラグを使用します。

引用description簡単:

設定、および起動され活動がすでに他の活動のすべてに、そして、 現在のタスクで実行中の代わりに、その 活動の新しいインスタンスを起動している場合

その上が閉じられ、 このインテントは、新しいインテントとして という古いアクティビティに配信されます。

たとえば、アクティビティA、B、C、Dからなるタスクを考えてみましょう。 Dは、次いでC及びDが終了され、Bは、スタックで、その結果、所定のインテント を受信今であり、活性Bの 成分に解決を意図してstartActivity()を呼び出す場合:A、B.

したがって、この例では、あなたがその新しい意図を取得します

// From ActivityD 
    Intent intent = new Intent(getApplicationContext(), ActivityB.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // The flag we wanted 
    intent.putExtra(ActivityB.SOME_EXTRA_THAT_I_NEED_CHANGED, SomeValue); // Example of changing the intent to get something new.. 
    startActivity(intent); 

は(この場合、私たちActivityBで)それを開始するために使用される起動モードとフラグによって定義されます。

上記の例では、アクティビティBの現在実行中のインスタンス を使用すると、その onNewIntent()メソッドでは、ここで起動されるか、または新しい 目的でそれ自体を終了し、再起動する新しいインテントを受信しますか。起動モードが「マルチプル」( のデフォルト)と宣言されていて、同じ インテントにFLAG_ACTIVITY_SINGLE_TOPを設定していない場合は、完了して再作成されます。他のすべての起動の場合は モード、またはFLAG_ACTIVITY_SINGLE_TOPが設定されている場合、このインテントは現在のインスタンスのonNewIntent()に配信される になります。

関連する問題