68

Hier ist, wie meine Anwendung gelegt wird:Wird onResume() vor onActivityResult() aufgerufen?

  1. onResume() Benutzer
  2. anmelden aufgefordert wird,
  3. Wenn in Benutzer anmeldet, kann er mit der App 3. fortsetzen Wenn der Benutzer auf jeder abmeldet Zeit, möchte ich erneut anmelden

Wie kann ich das erreichen?

Hier ist meine MainActivity:

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, onResume():

@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 der Benutzer erfolgreich angemeldet hat:

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

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

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

Hier mein LoginActivity ist wird vor onActivityResult() aufgerufen, wenn der Benutzer sich erfolgreich angemeldet hat, wird meine Hauptaktivität nicht noti fied, weil onResume() zuerst aufgerufen wird.

Wo ist der beste Ort, um zur Anmeldung aufzufordern?

Antwort

80

Der Aufruf von onActivityResult passiert vor onResume, eigentlich (siehe the docs). Sind Sie sicher, dass Sie die gewünschte Aktivität tatsächlich mit startActivityForResult starten und das Ergebnis der aufgerufenen Aktivität auf RESULT_OK setzen, bevor Sie einen Wert für Ihre Aktivität zurückgeben? Versuchen Sie einfach, eine Log Anweisung in Ihre onActivityResult zu setzen, um diesen Wert zu protokollieren und sicherzustellen, dass er getroffen wird. Wo setzen Sie auch den Wert der isLoggedIn Präferenz? Es sieht so aus, als ob du das in deiner Login-Aktivität auf true setzen solltest, bevor es zurückkehrt, aber das passiert eindeutig nicht.

+0

Ich stelle IsLoggedIn ein, nachdem sich der Benutzer angemeldet hat. Siehe meinen aktualisierten Code. nicht sicher, was ist falsch? –

+0

Sie haben Recht, onActivityResult() wird vor onResume() aufgerufen. Nicht sicher, warum meine Prefs dann falsch gelesen werden? –

+6

hinzugefügt eine commit() nach meinem putBoolean. Hat den Trick gemacht. –

2

Möglicherweise möchten Sie den Anmeldestatus von der Aktivität abstrahieren. Wenn ein Benutzer beispielsweise Kommentare posten kann, lassen Sie die onPost-Aktion für den Anmeldestatus pingen und gehen Sie von dort anstatt vom Aktivitätsstatus aus.

21

Mit Fragmenten ist es nicht einmal so einfach wie onActivityResult() vor dem Aufruf an onResume() aufgerufen werden. Wenn die Aktivität, zu der Sie zurückkehren, zwischenzeitlich gelöscht wurde, werden Sie feststellen, dass Aufrufe an (zum Beispiel) getActivity() von onActivityResult() null zurückgeben. Wenn die Aktivität jedoch nicht gelöscht wurde, gibt ein Aufruf an getActivity() die enthaltene Aktivität zurück.

Diese Inkonsistenz kann eine Quelle für schwer zu diagnostizierende Fehler sein, aber Sie können das Verhalten Ihrer Anwendung überprüfen, indem Sie die Entwickleroption "Aktivitäten nicht beibehalten" aktivieren. Ich tendiere dazu, dies eingeschaltet zu lassen - ich würde eher eine NullPointerException in Entwicklung sehen als in der Produktion.