2011-11-23 17 views
11

Sto sviluppando e app dove l'utente deve effettuare il login prima di utilizzarlo. Ho personalizzato la mia barra del titolo e ho messo un pulsante di disconnessione lì, per consentire agli utenti di disconnettersi quando vogliono, e accedere con un altro account. L'app dovrebbe quindi visualizzare di nuovo l'attività di accesso.Verifica login su ogni attività

Che funziona bene, ma il mio problema è con il pulsante Indietro. Quando l'utente si disconnette, viene visualizzata l'attività di accesso, ma se si preme indietro, l'app torna alla pagina precedente, consentendo all'utente di utilizzare nuovamente quell'attività, anche senza effettuare il login.

ho il mio onCreate() di ogni attività impostato in questo modo:

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

E il checkLogin():

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

tuttavia che non funziona come dovrebbe, la mia applicazione si blocca a volte quando si preme di nuovo a volte torna all'attività precedente, come ho detto, ea volte funziona davvero.

Come posso chiamare checkLogin() ogni volta che l'attività viene (ri) avviata?
Oppure c'è un altro modo migliore di fare ciò che voglio?

EDIT:

Sulla base @ risposta di Gabriele e il seguente schema da the SDK references, ho spostato il checkLogin() al metodo onResume() al posto del onCreate, risolvere il mio problema.

Activity life cycle

risposta

5

Spostare la chiamata a checkLogin() da onCreate() a onStart().

+0

Grazie, era esattamente quello di cui avevo bisogno. In realtà l'ho spostato su onResume, ha funzionato bene –

4

Nel Activity fisrt in cui l'utente loggato, tenta di salvare una variabile sui vostri SharedPreferences come questo:

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(); 

E poi in ogni attività di tuo, inserire questo codice per controllare se l'utente è loggato o meno, se non è connesso, così gli reindirizzare al LoginActivity in questo modo:

@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

Questo controllo che si sta facendo con SharedPreferences ha lo stesso risultato del controllo che sto facendo con getCurrentUser(), quindi è un po 'inutile (e sbagliato, spiegherò) per memorizzare lo stato di accesso. È sbagliato perché l'app non salva il login dopo che è stato chiuso, quindi dovrei controllare quando l'app si chiude per impostare questa preferenza su false.Ma spostando il controllo da onCreate a onStart risolto il mio problema –

+0

e per ulteriori prestazioni, dovresti aggiungere anche il test del login booleano, sul metodo onResume() – Houcine

5

Quello che suggerisco è di aggiungere voi checkLogin() a acitivity onResume() come il controllo in onCreate() metodo causerà chiamare verificare la presenza di login solo 1 volta quando l'attività creata.

O anche pastella è per spostarlo

onAttachToWindow() 

Così ogni volta che la vostra attività verrà a fronte. onAttachToWindow() verrà chiamato e verificherà l'accesso.

Problemi correlati