Wird onResume () vor onActivityResult () aufgerufen?

79

So ist meine App aufgebaut:

  1. Der Benutzer onResume () wird aufgefordert, sich anzumelden
  2. Wenn sich der Benutzer anmeldet, kann er die App 3 weiterhin verwenden . Wenn sich der Benutzer jederzeit abmeldet, möchte ich die Anmeldung erneut veranlassen

Wie kann ich das erreichen?

Hier ist meine Hauptaktivität:

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

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

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

Hier ist meine LoginActivity:

@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);
            }
        }
    }

Nachdem sich der Benutzer erfolgreich angemeldet hat:

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

Das Problem ist, dass onResume () vor onActivityResult () aufgerufen wird. Wenn sich der Benutzer erfolgreich angemeldet hat, wird meine Hauptaktivität nicht benachrichtigt, da onResume () zuerst aufgerufen wird.

Wo kann ich mich am besten zur Anmeldung auffordern?

Sheehan Alam
quelle

Antworten:

102

Der Aufruf von onActivityResult erfolgt tatsächlich vor onResume (siehe Dokumentation ). Sind Sie sicher, dass Sie die gewünschte Aktivität tatsächlich starten startActivityForResultund das Ergebnis der aufgerufenen Aktivität auf setzen, RESULT_OKbevor Sie einen Wert für Ihre Aktivität zurückgeben? Fügen Sie einfach eine LogAnweisung in Ihre ein onActivityResult, um diesen Wert zu protokollieren und sicherzustellen, dass er getroffen wird. Wo legen Sie den Wert der isLoggedInVoreinstellung fest? Es scheint, als sollten Sie dies truein Ihrer Anmeldeaktivität festlegen, bevor es trotzdem zurückkehrt, aber das passiert eindeutig nicht.

Bearbeiten

Die Dokumente sagen:

Sie erhalten diesen Anruf unmittelbar vor onResume (), wenn Ihre Aktivität neu gestartet wird.

Yoni Samlan
quelle
Ich setze isLoggedIn, nachdem sich der Benutzer angemeldet hat. Siehe meinen aktualisierten Code. nicht sicher, was falsch ist?
Sheehan Alam
1
Sie haben Recht, onActivityResult () wird vor onResume () aufgerufen. Sie sind sich nicht sicher, warum meine Einstellungen dann falsch gelesen werden?
Sheehan Alam
4
Beachten Sie, dass dies onActivityResultauch schon früher aufgerufen wurde onStart, was von vielen als Fehler angesehen wird: code.google.com/p/android/issues/detail?id=17787
Denis Kniazhev
30

Bei Fragmenten ist es nicht einmal so einfach, wie onActivityResult()vor dem Aufruf von aufgerufen zu werden onResume(). Wenn die Aktivität, zu der Sie zurückkehren, in der Zwischenzeit entsorgt wurde, werden Sie feststellen, dass Aufrufe von (zum Beispiel) getActivity()von onActivityResult()null zurückgeben. Wenn die Aktivität jedoch nicht entsorgt wurde, gibt ein Aufruf von getActivity()die enthaltende Aktivität zurück.

Diese Inkonsistenz kann zu schwer zu diagnostizierenden Fehlern führen. Sie können das Verhalten Ihrer Anwendung jedoch überprüfen, indem Sie die Entwickleroption "Aktivitäten nicht beibehalten" aktivieren. Ich neige dazu, dies eingeschaltet zu halten - ich würde eher eine NullPointerExceptionin der Entwicklung als in der Produktion sehen.

Phil Haigh
quelle
2

Möglicherweise möchten Sie den Anmeldestatus von der Aktivität entfernen. Wenn ein Benutzer beispielsweise Kommentare veröffentlichen kann, lassen Sie die Aktion onPost für den Anmeldestatus pingen und wechseln Sie von dort anstelle des Aktivitätsstatus.

Sgarman
quelle
0

Rückrufmethoden wie onResumesind keine geeigneten Orte, um die angeforderte Funktionalität zu erreichen. Ich würde vorschlagen, eine Klasse zu erstellen und dort die Anmelde- / Abmeldefunktion hinzuzufügen. Wenn ein Abruf zum Abmelden empfangen wird, rufen Sie die Anmeldefunktion auf.

Madhukar
quelle