2012-03-13 14 views
7

mam 3 Działania - , B i C.Działalność rozpoczął startActivityForResult() nie wraca do wywoływania Aktywny

Krótko mówiąc, działanie A rozpoczyna działanie B, następnie A również rozpoczyna działanie C i oczekuje wyniku z C, ale nigdy go nie otrzymuje.

Oto workflow aplikacja:

  1. aktywny A jest uruchomiona na starcie aplikacji i rozpoczyna aktywny B (nie dla wyniku, po prostu startActivity()) w onCreate.

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        startActivity(new Intent(getApplicationContext(), ActivityB.class)); 
    } 
    
  2. aktywny A, a następnie również rozpoczyna się działanie C dalej w kodzie, to czas wpływającej startActivityForResult(), a aktywność A ma również onActivityResult.

    Intent intent = new Intent(getApplicationContext(), ActivityC.class); 
    startActivityForResult(intent, 0); 
    

    i

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        ... 
    } 
    
  3. Działanie C wykorzystuje setResult() i koniec(), aby powrócić pewne informacje, które powinny przejść z powrotem do aktywności A, ponieważ aktywność Wywołany startActivityForResult().

    Intent intent = new Intent(); 
    intent.putExtra("encryption", encryption); 
    setResult(56, intent); 
    finish(); 
    

ALE workflow milknie w kroku 3 - Działanie A za onActivityResult nigdy nazywa (nie jest B dla tej sprawy), choć aktywny A jest jednym począwszy C dla wyniku. Nie wiem, czy działanie B utrudnia komunikację A i C, czy też może być problem. Każda pomoc jest doceniana.

+2

jej tak trudno zrozumieć .... Działalność B następnie korzysta z Aktywności A, aby nawiązać połączenie z serwisem internetowym, a jeśli Aktywność A określa, że ​​logowanie jest konieczne, rozpoczyna działanie C –

+0

Edytowane pytanie w celu uproszczenia. Zasadniczo działanie A rozpoczyna działanie B, następnie A również rozpoczyna działanie C i chce uzyskać wynik z C, ale nigdy go nie otrzymuje. – Gady

+0

StartActivityforresult przychodzi w swojej działalności B, od której zaczyna się działanie i wraca na onactivityresult –

Odpowiedz

20

Nigdy nie byłam w stanie tego uruchomić, więc zamiast tego użyłem Handler'a, aby zwrócić dane do niezbędnej Aktywności.

UPDATE: Po uruchomieniu w to jeszcze raz, okazało się, że prawdziwy powód to nie działa to, bo miałem android:noHistory="true" o powołaniu/odbierania Działanie A w manifeście. Usunięcie android:noHistory="true" naprawiło to, ale jeśli potrzebujesz tego, by było prawdziwe, to Handlery są dobrym rozwiązaniem.

+0

Dziękujemy! Nie mogłem się domyślić, dlaczego onActivityResult nie był wywoływany i to był powód. Zalogowałem się z dokumentacją dotyczącą Androida: https://code.google.com/p/android/issues/detail?id=68137. – Vicki

+0

@Vicki 13 miesięcy później to wydanie nadal stwierdza "Nowy". W jakiś sposób Android zasysa zbyt wiele obszarów. Dokumentacja jest z pewnością jedną z nich. – sstn

1

Nie sądzę, że powinieneś użyć getApplicationContext() w zamierzeniu.

Na stronie programisty.

getApplicationContext() 
Return the context of the single, global Application object of the current process. 

Kiedy ty startActivityForResult() próbuje powrócić do działalności określonej w intencji, które są zapewniając jako globalnym kontekście aplikacji.

Jeśli masz ActivityB to należy nazwać jak

Intent intent = new Intent(ActivityB.this, ActivityC.class); 
startActivityForResult(intent, 0); 

Następnie będzie starał się powrócić do ActivityB gdy ActivityC jest wykonywana.

+0

Myślałem, że działanie, do którego zwracany jest wynik, jest działaniem, które o nazwie startActivityForResult(), a nie o kontekście określonym podczas tworzenia intencji. Niezależnie od tego, zmiana go w podanym momencie nadal nie zwróciła wyniku do onActivityResult. – Gady

+0

Wyjaśnienie, jeśli ostatnie 2 linie kodu są wywoływane z ActivityB. ActivityC zostanie uruchomiony, a następnie wróci do ActivityB, nie odpowie na twoje oryginalne pytanie więcej, aby zilustrować poprawne parametry, które będą użyte podczas tworzenia intencji. Być może pomocne może być dodanie pełniejszego przykładu kodu, który uruchamia działania. – triggs

+0

W moim scenariuszu dwa ostatnie wiersze kodu są wywoływane z działania A, w którym chcę, aby wynik został zwrócony. Ale tak się nie dzieje i jedyne, co mogę stwierdzić, to to, że działanie A rozpoczyna też najpierw Aktywność B. – Gady

-2

Może spróbuj tego:

if (getParent() == null) { 
setResult(RESULT_OK, dataTobePassback); 
} else { 
getParent().setResult(RESULT_OK, dataTobePassback); 
} 

dataTobePassback jest Intent że nosi rzeczy może trzeba przejść z powrotem do aktywności wywołującej

+0

Byłoby interesujące dowiedzieć się, dlaczego/jak to powinno działać. – sstn

Powiązane problemy