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.