¿Se llama a onResume () antes de onActivityResult ()?

79

Así es como se presenta mi aplicación:

  1. Se solicita al usuario onResume () que inicie sesión
  2. Si el usuario inicia sesión, puede seguir usando la aplicación. 3. Si el usuario cierra la sesión en cualquier momento, quiero que vuelva a solicitar el inicio de sesión.

¿Cómo puedo conseguir esto?

Aquí está mi MainActivity:

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

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

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

Aquí está mi 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);
            }
        }
    }

Después de que el usuario haya iniciado sesión correctamente:

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

El problema es que se llama a onResume () antes que a onActivityResult (), por lo que cuando el usuario ha iniciado sesión correctamente, mi actividad principal no recibe una notificación porque se llama primero a onResume ().

¿Cuál es el mejor lugar para solicitar el inicio de sesión?

Sheehan Alam
fuente

Respuestas:

102

La llamada a onActivityResult ocurre antes de onResume, en realidad (vea los documentos ). ¿Está seguro de que está realmente iniciando la actividad con la que deseaba startActivityForResulty de que está configurando el resultado de la actividad invocada en RESULT_OKantes de devolver un valor a su actividad? Intente simplemente poner una Logdeclaración en su onActivityResultpara registrar ese valor y asegúrese de que se acierte. Además, ¿dónde está estableciendo el valor de la isLoggedInpreferencia? Parece que debería configurarlo trueen su actividad de inicio de sesión antes de que regrese de todos modos, pero eso claramente no está sucediendo.

Editar

Los doctores dicen:

Recibirás esta llamada inmediatamente antes de onResume () cuando tu actividad se reinicie.

Yoni Samlan
fuente
Estoy configurando isLoggedIn después de que el usuario haya iniciado sesión. Vea mi código actualizado. no estoy seguro de que esta mal
Sheehan Alam
1
tiene razón, onActivityResult () se llama antes de onResume (). ¿No estás seguro de por qué mis preferencias se leen mal entonces?
Sheehan Alam
4
Tenga en cuenta que onActivityResult también se llama antes onStart, lo que muchas personas consideran un error: code.google.com/p/android/issues/detail?id=17787
Denis Kniazhev
30

Con los fragmentos, ni siquiera es tan simple como onActivityResult()ser llamado antes de la llamada a onResume(). Si la actividad a la que está regresando se eliminó en el ínterin, encontrará que las llamadas a (por ejemplo) getActivity()desde onActivityResult()devolverán un valor nulo. Sin embargo, si la actividad no se ha eliminado, una llamada a getActivity()devolverá la actividad que la contiene.

Esta inconsistencia puede ser una fuente de defectos difíciles de diagnosticar, pero puede verificar el comportamiento de su aplicación habilitando la opción de desarrollador "No mantener actividades". Tiendo a mantener esto encendido, prefiero ver un NullPointerExceptionen desarrollo que en producción.

Phil Haigh
fuente
2

Es posible que desee considerar abstraer el estado de inicio de sesión de la actividad. Por ejemplo, si un usuario puede publicar comentarios, deje que la acción onPost haga ping para el estado de inicio de sesión y vaya desde allí, en lugar del estado de actividad.

sgarman
fuente
0

Los métodos de devolución de llamada como onResumeno son lugares adecuados para lograr la funcionalidad solicitada. Sugeriría hacer una clase y agregar la funcionalidad de inicio / cierre de sesión allí. cuando se reciba una devolución de llamada de cierre de sesión, llame a la función de inicio de sesión.

Madhukar
fuente