Android - startActivityForResult natychmiast wyzwala onActivityResult


144

Uruchamiam działania z głównego działania w mojej aplikacji przy użyciu połączenia startActivityForResult(intent, ACTIVITY_TYPE)i wszystkie działają z wyjątkiem jednego.

Ten, gdy zostanie wywołany, uruchamia działanie zgodnie z życzeniem, ale w dzienniku widzę, że onActivityResult()jest uruchamiane natychmiast. Aktywność pojawia się, ale RESULT_CANCELEDjest natychmiast przywracana onActivityResult().

Następnie wchodzę w interakcję z działaniem, naciskam przycisk, który wywołuje finish(), ale onActivityResult()tym razem nie jest wywoływany (ponieważ najwyraźniej wynik został już zwrócony).

Czy to ma dla kogoś sens? Czy ktoś widział to zachowanie wcześniej?

Odpowiedzi:


315

Nie możesz użyć, startActivityForResult()jeśli Twoja aktywność jest uruchamiana jako singleInstancelub singleTask. standardlub singleToptryb uruchamiania rozwiąże problem.


2
Dziękuję wam obojgu, miałem to w swoim pliku manifestu i całkowicie o tym zapomniałem
TomBomb

9
ŁAŁ! Wydaje się, że to oczywista rzecz do dodania do javadoców! Zmarnowałem cały wieczór, próbując zmusić to do działania, a ta odpowiedź TAK przypomniała mi, że moja aktywność została ustawiona na singleTop.
swooby

20
singleTopwydaje mi się w porządku, singleTaskjednak powodował ten problem i dlatego na singleInstancepewno też by to zrobił
darnmason

4
Spędziłem też zbyt dużo czasu na debugowaniu tego! Dzięki!!
suomi35

4
W moim przypadku nie zdefiniowałem żadnej klasy jako singleInstance lub singleTop, ale nadal to się dzieje ... jakaś sugestia?
CoDe

110

Dodatkowo upewnij się, że intencja nie ma Intent.FLAG_ACTIVITY_NEW_TASKzestawu.

Z dokumentów :

Ta flaga nie może być używana, gdy dzwoniący żąda wyniku działania, które jest uruchamiane.


3
To rozwiązało problem w moim przypadku. Problem nie został spowodowany przez singleInstance, singleTop ani singleTask.
Diana

Jesteś mennicą (ratownikiem życia). To był mój dokładny problem, gdy chciałem, aby użytkownik przechwycił obraz we fragmencie
kyay,

@Diana, czy pamiętasz, czego zamiast tego użyłaś Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme

@Keselme Przepraszamy, minęło dużo czasu, chciałbym pomóc, ale nie pamiętam i nie mam już dostępu do tego kodu.
Diana

Tak, naprawiłem to. startActivityForResult nie powinno być używane z Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen

21

Widziałem już takie zachowanie, upewnij się, że aktywność dotycząca miejsca docelowego (ta specjalna aktywność) nie znajduje się singleInstancew pliku AndroidManifest. Jeśli działanie ma wartość singleInstance, powróci RESULT_CANCELEDprzed uruchomieniem!


18

Chciałbym również dodać, że możesz wywołać aplikację zewnętrzną za pomocą:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Która utworzyłaby intencję z Intent.FLAG_ACTIVITY_NEW_TASKdodaniem domyślnie, więc zadzwoń:
in.setFlags(0);
Która wyczyści tę flagę, a następnie możesz przejść do:startActivityForResult(in, action);

Powód, dla którego to robię, jest to, że mam aplikację narzędziową, która ma wspólną funkcjonalność między kilkoma innymi aplikacjami i mogę przechowywać zmiany w kodzie w jednej lokalizacji, zamiast martwić się o wiele aktualizacji.


Wiem, że to jest stare, ale było to dla mnie tak bezcenne, że chciałem podziękować użytkownikowi i zwrócić uwagę każdemu, kto przeskakuje między czynnościami, że to cholerne złoto! Uratowałem mój tyłek podczas hackathonu;)
Wes Winn

To wymaga więcej uwagi. To najlepsze rozwiązanie i u mnie działa idealnie. Zaoszczędziłeś mi dużo czasu, bardzo dziękuję.
Aritra Roy

Głosowanie za tą odpowiedzią, ponieważ to był dokładnie ten problem, który miałem dziś rano! Dzięki za rozwiązanie!
Will Johnson

Dzięki. intent.setFlags (0) rozwiązało problem. Teraz druga aplikacja uruchamia się poprawnie i zwraca wynik do aplikacji dzwoniącej
Niaz

5

startActivityForResult()nie działa z aktywnością singleInstancelub singleTaskw wersji Androida sprzed wersji Lollipop. Od Androida 5 działa (zobacz tę odpowiedź, aby uzyskać więcej informacji).


5

Uruchamia się również, jeśli masz FLAG_ACTIVITY_NEW_TASKzamiar.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

Dzięki. Dodałem FLAG_ACTIVITY_NEW_TASK do mojej aktywności.
Chirag Savsani

1

Mój problem dotyczył dzwonienia. Jego deklaracja w AndroidManifest miała następującą właściwość:

android:noHistory="true"

Zmieniono go na „false” i teraz działa dobrze.


1

Android 4.4 ma mały problem z oczekiwaniem na powrót po zakończeniu działania Aby rozwiązać ten problem, ważne jest, aby ustawić:

  • wszystkie działania będą miały ten sam atrybut powinowactwa zadania. ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

To rozwiązanie działa ze wszystkimi wersjami Androida

Zobacz to dla taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instently/1004072


1

Sprawdź również, czy android: noHistory = "true" w aktywności w Manifest, jeśli tak, to nie zadziała.


0

Dla ActivityGrouplub TabHosti innych, być może xxxActivityjest subActivityjego rodzicem. Wtedy startActivityForResultnie może działać, ale rodzic może uzyskać wynik.

  1. połączenie getParent().startActivityForResult()z poddziałania

  2. Twój rodzic (ten ActivityGroup) będzie w stanie obsłużyć onActivityResult. Więc stworzyłem podklasę ActivityGroupi poradziłem sobie z tym onActivityResult.

  3. W razie potrzeby możesz przekierować wynik z powrotem do działania podrzędnego. Po prostu pobierz bieżącą aktywność getLocalActivityManager().getCurrentActivity(). Moje działania podrzędne dziedziczą z działania niestandardowego, więc dodałem handleActivityResult(requestCode, resultCode, data)w tej podklasie, ActivityGroupaby wywołać.

przykład: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


Co myślisz o tym szczególnym przypadku podczas wywoływania domyślnej przeglądarki internetowej: codeproject.com/Questions/990063/ ...
Ahmad Ebrahimi

0

onActivityResult()przejdzie również RESULT_CANCELEDjako, resultCodejeśli błędnie wpiszesz nazwę pakietu lub klasy w pliku manifestu.


0

W Android Manifest ustawiono android:launchMode="singleTop"działanie, które chcesz otworzyć z wynikiem i podczas otwierania ustawiono flagę działaniaintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

Jeśli zdefiniowałeś android:noHistory="true"w działaniu w swoim AndroidManifest.xml, spowoduje to ten sam problem tutaj.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.