Czy onResume () jest wywoływana przed onActivityResult ()?

79

Oto jak wygląda moja aplikacja:

  1. Użytkownik onResume () jest proszony o zalogowanie
  2. Jeśli użytkownik się zaloguje, może kontynuować korzystanie z aplikacji 3. Jeśli użytkownik wyloguje się w dowolnym momencie, chcę ponownie poprosić o zalogowanie

Jak mogę to osiągnąć?

Oto moja główna aktywność:

@Override
    protected void onResume(){
        super.onResume();

        isLoggedIn = prefs.getBoolean("isLoggedIn", false);

        if(!isLoggedIn){
            showLoginActivity();
        }
    }

Oto moja aktywność logowania:

@Override
        protected void onPostExecute(JSONObject json) {
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try {
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized)){
                    Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show();
                    prefs.edit().putBoolean("isLoggedIn",true);

                    setResult(RESULT_OK, getIntent());
                    finish();
                }
                else if (status.equals(unauthorized)){
                    Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
                else if(status.equals(notfound)){
                    Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
            } catch (JSONException e) {
                System.out.println(e);
            } catch (NullPointerException e) {
                System.out.println(e);
            }
        }
    }

Po pomyślnym zalogowaniu się użytkownika:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
        }
    }

Problem polega na tym, że onResume () jest wywoływana przed onActivityResult (), więc po pomyślnym zalogowaniu użytkownika moja główna aktywność nie jest powiadamiana, ponieważ onResume () jest wywoływana jako pierwsza.

Gdzie jest najlepsze miejsce do proszenia o logowanie?

Sheehan Alam
źródło

Odpowiedzi:

102

W rzeczywistości wywołanie onActivityResult następuje przed onResume (zobacz dokumentację ). Czy jesteś pewien, że faktycznie rozpoczynasz działanie, od którego chciałeś, startActivityForResulti że ustawiasz wynik wywoływanego działania RESULT_OKprzed zwróceniem wartości do działania? Spróbuj po prostu umieścić Logw swoim oświadczeniu, onActivityResultaby zarejestrować tę wartość i upewnić się, że zostanie trafiony. Gdzie ustawiasz wartość isLoggedInpreferencji? Wygląda na to, że powinieneś ustawić to truew swojej aktywności logowania, zanim i tak powróci, ale najwyraźniej tak się nie dzieje.

Edytować

Doktorzy mówią:

Otrzymasz to wywołanie bezpośrednio przed onResume (), gdy Twoja aktywność zostanie wznowiona.

Yoni Samlan
źródło
Ustawiam isLoggedIn po zalogowaniu użytkownika. Zobacz mój zaktualizowany kod. nie wiesz, co się stało?
Sheehan Alam
1
masz rację, onActivityResult () jest wywoływana przed onResume (). Nie wiesz, dlaczego moje ustawienia wstępne są źle odczytywane?
Sheehan Alam
4
Zwróć uwagę, że onActivityResultjest to również wywoływane wcześniej onStart, co jest uważane przez wiele osób za błąd: code.google.com/p/android/issues/detail?id=17787
Denis Kniazhev
30

W przypadku fragmentów nie jest to nawet tak proste, jak onActivityResult()wywołanie przed wywołaniem onResume(). Jeśli czynność, do której powracasz, została w międzyczasie usunięta, okaże się, że wywołania (na przykład) getActivity()from onActivityResult()zwróci wartość null. Jeśli jednak działanie nie zostało usunięte, wywołanie getActivity()zwróci działanie zawierające.

Ta niespójność może być źródłem trudnych do zdiagnozowania defektów, ale możesz sprawdzić zachowanie swojej aplikacji, włączając opcję programisty „Nie zachowuj aktywności”. Mam tendencję do włączania tego - wolę raczej widzieć NullPointerExceptionw fazie rozwoju niż w produkcji.

Phil Haigh
źródło
2

Możesz rozważyć wyodrębnienie stanu logowania z działania. Na przykład, jeśli użytkownik może publikować komentarze, pozwól, aby akcja onPost oznaczała stan logowania i przejdź stamtąd, zamiast ze stanu aktywności.

sgarman
źródło
0

Metody wywołania zwrotnego, takie jak, onResumenie są odpowiednimi miejscami do osiągnięcia żądanej funkcjonalności. Sugerowałbym utworzenie klasy i dodanie tam funkcji logowania / wylogowania. po odebraniu wywołania zwrotnego wylogowania, wywołaj funkcję logowania.

Madhukar
źródło