onActivityResult () wywołane przedwcześnie


92

Rozpoczynam Activity(potomka PreferenceActivity) od mojej działalności pracowniczej w następujący sposób:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigureklasa NIE ma żadnych setResult()wywołań. W rzeczywistości MyConfigureklasa nie ma żadnego kodu, z wyjątkiem miejsca, w OnCreate()którym ładuje preferencje za pomocą addPreferencesFromResource.

Teraz onActivityResultjest wywoływana z requestCodez 1458przedwcześnie, zaraz po MyConfigureuruchomieniu czynności. Testowano na emulatorach 1.6 i 2.1 oraz urządzeniu 2.1. Czy jest wezwanie do setResult()pochowania gdzieś w środku PreferenceActivity? Albo jak inaczej można wytłumaczyć to przedwczesne wezwanie?


1
Działanie nie kończy się na setResults (), kończy się na finish (). Czy możesz pokazać metodę onCreate Twojej aktywności MyConfigure?
Cheryl Simon

Tak nie jest. Jednak coś wywołuje metodę setResult () z wyprzedzeniem i zastanawiam się, co to jest. Kod onCreate jest trywialny: public class MyConfigure extends PreferenceActivity {@Override protected void onCreate (BundleainedInstanceState) {super.onCreate (saveInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Eugene Mayevski 'Callback,

jak myślisz, aby wiedzieć, że nazywa się setResult?
RoflcoptrException

Właśnie do tego stworzyłem pytanie. Aby dowiedzieć się, dlaczego onActivityResult jest wywoływany przedwcześnie.
Eugene Mayevski 'Callback'

Co dane wyjściowe logcat mówią o tym okresie? W szczególności tag „ActivityManager”, który pokazuje, które intencje są wywoływane.
Christopher Orr

Odpowiedzi:


254

Można to naprawić, zmieniając tryb uruchamiania na singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

W Androidzie jest błąd / funkcja (?), Która natychmiast zgłasza wynik (który nie został jeszcze ustawiony) dla Activity, zadeklarowany jako singleTask(pomimo tego, że aktywność nadal działa). Jeśli zmienimy launchModeaktywność rodzica zsingleTask na singleTop, wszystko działa zgodnie z oczekiwaniami - wynik jest raportowany dopiero po zakończeniu czynności. Chociaż to zachowanie ma pewne wyjaśnienie ( singleTaskmoże istnieć tylko jedna czynność i może się zdarzyć wielu kelnerów), nadal jest to dla mnie nielogiczne ograniczenie.


2
Wydaje się, że to błąd! ^^ bardzo dziwne zachowanie!
Felipe

7
Jeśli aktywność ma tryb uruchamiania pojedynczego zadania, nie musi otrzymywać wyników z działań podrzędnych korzystających z onActivityResult. Aktywności podrzędne po prostu wywołują finish (), a następnie rozpoczynają działanie główne z przeznaczeniem na dane. W głównym działaniu należy nadpisać metodę onNewIntent i przetworzyć otrzymaną intencję.
Nik,

43
launchMode = "singleInstance" również powoduje takie zachowanie
ffleandro

1
Wygląda na to, że to nie zadziałało, próbowałem singleTop na aktywność rodziców, ale bezskutecznie. Ustawiłem również flagę intencji na FLAG_ACTIVITY_SINGLE_TOP, chociaż żądanie pokazuje teraz poprawną wartość, ale wynik zawsze wynosi 0.
Neon Warge

11
dzieje się to w Kitkat 4.4.4, nie dzieje się na Lolipopie.
Somasundaram Mahesh

18

Rozwiązałem problem po usunięciu intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); przed zadzwonieniem fragment.startActivityForResult(intent, 0);.


1
Dziękuję Ci! To rozwiązało mój problem. Czy jest gdzieś wytłumaczenie?
Conner Harkness

W dokumentach znajduje się wyjaśnienie dotyczące flagi „Ta flaga nie może być używana, gdy dzwoniący żąda wyniku działania, które jest uruchamiane”. Cóż, to nie jest wyjaśnienie, ale przynajmniej ostrzeżenie!
Code Novitiate

5

Właśnie usunąłem wszystkie moje niestandardowe „android: launchMode” z mojej aktywności i wszystko działało jak marzenie. Nie jest dobrym pomysłem zmienianie tego, gdy nie wiesz DOKŁADNIE, co rozumie Android ... Android jest pod tym względem trochę skomplikowany.


1

Zdarzyło mi się to, gdy intencja miała Intent.FLAG_RECEIVER_FOREGROUNDustawioną flagę.

(Tak, ta flaga nie jest związana z aktywnością, ale miałem ją we wszystkich moich intencjach jako część strzelby rozwiązania innego problemu .)


-1

Ponownie, jak w komentarzu Mayry, setResult()nie ma nic wspólnego z twoim problemem. z jakiegoś powodu MyConfigureklasa kończy się sama, a kiedy to się dzieje, PreferenceActivitypo prostu zakłada, że ​​może to być wynikMyConfigure ponieważ tak właśnie napisałeś kod.

Dzieje się tak również wtedy, gdy wymuszasz cofnięcie jakiejkolwiek czynności, która została rozpoczęta startActivityForResult() ...

Więc myślę, że lepiej skupić się na tym, dlaczego twoja MyConfigureklasa jest skończona na siłę.


Klasa MyConfigure NIE kończy się, twoje przypuszczenia są błędne, przepraszam. Gdyby tak było, nie byłoby wątpliwości
oddzwonienie Eugene Mayevski
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.