2011-11-23 17 views
11

Estoy desarrollando y la aplicación donde el usuario debe iniciar sesión antes de usarlo. Personalicé mi barra de título y coloqué un botón para cerrar la sesión allí, para permitir a los usuarios cerrar la sesión cuando lo deseen y acceder con otra cuenta. La aplicación debería mostrar la actividad de inicio de sesión nuevamente.Verificar el inicio de sesión en cada actividad

Eso funciona bien, pero mi problema es con el botón Atrás. Cuando el usuario cierra la sesión, aparece la actividad de inicio de sesión, pero si presiona hacia atrás, la aplicación vuelve a la página anterior, lo que permite al usuario volver a usar esa actividad, incluso sin iniciar sesión.

tengo mi onCreate() de toda actividad establecido de esta manera:

public void onCreate(Bundle savedInstanceState) { 
    // Activity code 
    checkLogin(); 
} 

Y el checkLogin():

if (GlobalContext.getCurrentUser() == null) { 
    Intent i = new Intent(this, LoginActivity.class); 
    startActivityForResult(i, GlobalContext.REQUEST_LOGIN); 
} 

Sin embargo eso no funciona como debería, mis aplicación se bloquea a veces cuando se presiona la espalda , a veces vuelve a la actividad anterior como dije, y algunas veces realmente funciona.

¿Cómo puedo hacer que se llame al checkLogin() cada vez que se inicia (re) la actividad?
¿O hay otra forma mejor de hacer lo que quiero?

EDIT:

@ Sobre la base de la respuesta de Gabriel y el siguiente diagrama de the SDK references, moví el checkLogin() al método onResume() en lugar de la onCreate, la solución de mi problema.

Activity life cycle

Respuesta

5

Mueva la llamada a checkLogin() de onCreate() a onStart().

+0

Gracias, eso era exactamente lo que necesitaba. De hecho, lo cambié a on Reesume, funcionó bien –

4

En la Actividad fisrt donde el usuario se conecta, intenta guardar una variable en sus SharedPreferences así:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putBoolean("logged", true); // set it to false when the user is logged out 

     // Commit the edits! 
     editor.commit(); 

Y luego, en todas las actividades de los suyos, poner este código para comprobar si el usuario está conectado o no, si no está conectado, por lo que le redirija a la LoginActivity así:

@Override 
    protected void onStart(Bundle state){ 
     super.onStart(state); 
     . . . 

     // Restore preferences 
     SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
     boolean loggedIn = settings.getBoolean("logged", true); 
     if(!loggedIn){ 
      Toast.makeText(this,"you are not logged in !!",3000).show(); 
      Intent i = new Intent(this,LoginActivity.class); 
      startActivity(i); 
     } 
    } 
+0

Esta comprobación que está haciendo con SharedPreferences tiene el mismo resultado que con GetCurrentUser(), por lo que es inútil (y erróneo, lo explicaré) almacenar el estado de inicio de sesión. Está mal porque la aplicación no guarda el inicio de sesión después de que está cerrado, así que tendría que verificar cuándo se cierra la aplicación para establecer esta preferencia en falso.Pero mover el cheque de onCreate a onStart resolvió mi problema –

+0

y para obtener más rendimiento, también debe agregar la prueba del booleano loggedIn, en el método onResume() – Houcine

5

Lo que sugiero es añadir que checkLogin() a Acitivity onResume() como la comprobación de que en onCreate() método hará que llamar para comprobar inicio de sesión sólo 1 vez cuando la actividad creada.

O incluso bateador es para moverlo a

onAttachToWindow() 

Así que cada vez que su actividad vendrá a frente. onAttachToWindow() se llamará y verificará el inicio de sesión.

Cuestiones relacionadas