2011-11-23 14 views
11

Zajmuję się tworzeniem aplikacji, w której użytkownik musi się zalogować przed jej użyciem. Dostosowałem swój pasek tytułowy i umieściłem w nim przycisk wylogowania, aby umożliwić użytkownikom wylogowanie, kiedy chcą i zalogować się przy użyciu innego konta. Aplikacja powinna ponownie wyświetlić aktywność logowania.Sprawdź logowanie przy każdej aktywności

To działa dobrze, ale moim problemem jest przycisk Wstecz. Gdy użytkownik się wyloguje, pojawia się aktywność logowania, ale jeśli on naciśnie, aplikacja powraca do poprzedniej strony, umożliwiając użytkownikowi ponowne użycie tej czynności, nawet bez logowania.

Mam onCreate() każdej działalności utworzonego w ten sposób:

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

A checkLogin():

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

jednak, że nie działa tak jak powinien, moim awarii aplikacji czasami kiedy pędzę z powrotem Czasami wraca do poprzedniej czynności, tak jak powiedziałem, a czasami tak naprawdę działa.

W jaki sposób mogę uzyskać wywołanie checkLogin() za każdym razem, gdy działanie jest (ponownie) uruchamiane?
Czy istnieje inny, lepszy sposób robienia tego, co chcę?

EDIT:

podstawie @ odpowiedzi Gabriela i następującym schematem z the SDK references, przeniosłem się checkLogin() metody onResume() zamiast onCreate, rozwiązania mojego problemu.

Activity life cycle

Odpowiedz

5

Przesuń wezwanie do checkLogin() od onCreate() do onStart().

+0

Dzięki, to było dokładnie to, czego potrzebowałem. Właściwie to przeniosłem go do OnResume, działało dobrze –

4

W fisrt działalności, w których użytkownik zalogowany, spróbuj zapisać zmienną na swoim SharedPreferences tak:

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

a następnie w każdej działalności twojej umieścić ten kod, aby sprawdzić jeśli użytkownik jest zalogowany czy nie, jeśli nie jest zalogowany, aby przekierować go do LoginActivity jak ten:

@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

Sprawdzanie, które robisz z SharedPreferences, daje taki sam wynik sprawdzenia, jaki robię przy pomocy getCurrentUser(), więc jest to trochę bez sensu (i źle, wyjaśnię), aby zapisać stan logowania. To źle, ponieważ aplikacja nie zapisuje loginu po jego zamknięciu, więc musiałbym sprawdzić, kiedy aplikacja zostanie zamknięta, aby ustawić tę preferencję na false.Ale przeniesienie czeku z onCreate do onStart rozwiązało mój problem –

+0

i dla większej wydajności, powinieneś dodać test logicznej wartości logicznej, w metodzie onResume() – Houcine

5

Co proponuję dodać checkLogin() do acitivity onResume(), ponieważ sprawdzanie go w metodzie onCreate() spowoduje wywołanie sprawdzenia logowania 1 raz tylko podczas tworzenia aktywności.

Albo nawet ciasto jest przeniesienie go do

onAttachToWindow() 

Więc za każdym razem swoją aktywność przyjdzie do przodu. onAttachToWindow() zostanie wywołany i sprawdzi logowanie.

Powiązane problemy