2013-08-14 14 views
8

mam aplikację, która ma to przejście:Android- Wracając do poprzedniej pracy z inną wartością Intent

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

Po wejściu C, muszę sprawdzić flagę. Następnie muszę przekazać to jako zamiar (powiedzmy intentX = false) do D. Po zrobieniu czegoś w D, po naciśnięciu przycisku nastąpi powrót do C. Po prostu przekazałem ponownie intentX z wartością true, a następnie startActivity C ponownie. Stało się tak dlatego, że stworzył inną działalność C.

Chcę tylko, abym nie musiał zaczynać nowej aktywności C, ale używał poprzedniego C, dzwoniąc pod numer super.onBackPressed(). Ale nie mogę przekazać nowej wartości intentX. Czy istnieje inny sposób, aby osiągnąć to, co chcę. Może trochę tęskniłem.

Odpowiedz

13

Co chcesz to startActivityForResult(). Gdy przejdziesz z C do D, zamiast używać startActivity() użyj zamiast tego startActivityForResult(). Następnie, gdy chcesz wrócić z D do C, użyjesz setResult(), który może zawierać obiekt Intent z extras, aby powrócić do C.

Nie polecam robić tego w onBackPressed(), jeśli nie masz ma, ponieważ nie będzie to, czego użytkownik oczekuje. Zamiast tego powinieneś powrócić z tymi danymi dzięki zdarzeniu, na przykład kliknięciu Button.

Więc w C zrobisz coś takiego

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

potem w D kiedy jesteś gotowy, aby powrócić

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

następnie po powrocie do C będzie wprowadzić tę metodę (taken from the Docs)

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

oh, będę musiał spróbować jeszcze raz. musiałem go wcześniej użyć w niewłaściwy sposób. – sftdev

+0

To jest możliwe, łatwo się z tym pogubić, dopóki nie zrozumiesz, jak to działa. To powinno wystarczyć, aby zacząć, ale jest też przyzwoity przykład w dokumentach, do których się przyłączyłem, samouczkach i przykładach w Google i SO – codeMagic

+0

Kiedy "jesteś gotów na powrót" po ustawieniu wyniku - jaką funkcję należy nazwać ? Czy powinienem wywołać 'finish()'? –

1

W niektórych przypadkach startActivityForResult naprawdę nie jest potrzebny lub zmiana wszystkich wywołań startActivity na startActivityForResult jest niepraktyczna.

Jeśli potrzebny jest prosty przypadek dopiero uruchomienia poprzedniej czynności "ponownie", zalecam: użyj flagi FLAG_ACTIVITY_CLEAR_TOP.

Cytowanie krótki description:

Jeśli ustawione, a aktywność uruchamiana jest już uruchomiony w bieżącym zadaniu , wtedy zamiast uruchomienia nowej instancji tej działalności, wszystkie inne działania na do góry zostanie zamknięty i ten zamiar zostanie dostarczony do (obecnie na górze) starej działalności jako nowy zamiar .

Weźmy na przykład zadanie składające się z czynności: A, B, C, D. Jeśli wymaga startActivity (D) z zamiarem, który rozpoznaje składowej kinazy B , a C i D będą zakończone i B otrzymać daną Intent, powodując w stosie jest teraz A, B.

Więc ten przykład

// 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); 

gdzie dostaniesz tę nową intencję jest określony przez który tryb launch i które flagi gdzie wykorzystywane do jej uruchomienia (w tym przypadku nasza ActivityB).

aktualnie działającej instancji działalności B w powyższym przykładzie będzie albo otrzymać nową intencję zaczynają tutaj w sposobie jego onNewIntent(), lub być sama wykończone i ponownie z nowym intencji. Jeśli zadeklarowało, że tryb uruchamiania ma wartość "wiele" (domyślnie: ) i nie ustawiono FLAG_ACTIVITY_SINGLE_TOP w tej samej intencji , to zostanie ono zakończone i ponownie utworzone; dla wszystkich innych trybów uruchamiania lub jeśli FLAG_ACTIVITY_SINGLE_TOP jest ustawiona, ta intencja będzie dostarczona do bieżącej instancji naNewIntent().

Powiązane problemy