0

i ont une activité principale qui lancent un LoginActivity pour la première fois. Ici tout va bien. Lorsque l'utilisateur se connecte, les informations de l'utilisateur sont sauvegardées dans des préférences partagées (pour faire une demande à ApiRest) donc cette fonction qui ouvre la connexion seulement la première fois fonctionne parce que la prochaine fois que je démarre l'application je reste dans mainActivity. cette activité principale a 3 fragments (dans viewpager) les 3 frgaments quand sont créés font demande d'obtenir des informations de l'API automatiquement. mon problème est dans l'appbar de la mainActivity j'ai un élément de menu qui déconnecte l'utilisateur. mon intention est de rediriger l'application vers loginActivity et d'effacer la pile d'activités et effacer les préférences partagées. mais mes résultats sont. 1. Je suis redirigé vers l'activité de connexion mais quand je ferme l'application et l'ouvre à nouveau, elle ne respecte pas ma méthode dans l'activité principale (si c'est la première fois qu'elle doit rediriger vers LoginActivity) et crée les 3 fragments qui commencent immédiatement pour faire les demandes mais ils n'ont pas les paramètres (ils sont nuls ou 0 puisque j'efface les préférences partagées) donc l'application se bloque. Pourquoi ma méthode pour ouvrir la première fois LoginActivity est omise ??? grâce à l'avanceméthode logout Android et sharedpreference clair ne fonctionne pas

voici mon MainActivity avec la méthode qui échoue ou l'omission après la déconnexion

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final Variables variableGlobal = (Variables)getApplicationContext(); 
    SharedPreferences sharedPreferences= getSharedPreferences("firstTime",this.MODE_PRIVATE); 
    boolean firstTime = sharedPreferences.getBoolean("firstTime",true); 
    if(firstTime){ 
     SharedPreferences.Editor edit = sharedPreferences.edit(); 
     edit.putBoolean("firstTime", false); 
     edit.commit(); 
     startActivity(new Intent(MainActivity.this, LoginActivity.class)); 
     finish(); 

    }.... 

ici est mon code logout:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.logoutmain) { 
//Here i clear the sharedpref datos wich contains the user information 
     SharedPreferences pref = getSharedPreferences("datos",MODE_PRIVATE); 
     SharedPreferences.Editor editorpref = pref.edit(); 
     editorpref.clear(); 
     editorpref.commit(); 

//Here i clear the sharedPref that contains the value (boolean) to say the app if it is the first time or not 
     SharedPreferences pref2 = getSharedPreferences("firstTime",this.MODE_PRIVATE); 
     SharedPreferences.Editor editorpref2 = pref2.edit(); 
     editorpref2.putBoolean("firstTime",true); 
     editorpref2.commit(); 
     System.out.println("shared pref cleared"); 
     Intent intent=new Intent(getApplicationContext(),MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
     finish(); 
     return true; 
    }... 

voici mon loginActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    btnLogin= (Button)findViewById(R.id.btnLogin); 

    api= ApiUtils.getAPIService(); 
    btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      login(); 
     } 
    }); 

} 

Rappelez-vous, quand je lance mon application, la méthode pour vérifier si elle est le firstTime qui exécute ce lancer à LoginActivity fonctionne bien, il est seulement lancé le firsTime et la prochaine fois que j'ouvre toujours dans Main Activity, mais quand je me déconnecte il me redirige vers Login et efface la stack et le sharedpref, MAIS OMITT la méthode pour chek c'est le première fois et me garde dans MainActivity et l'application se bloque. Pourquoi?? grâce à Adavanced

+0

Eh bien, je suppose que vous ne devriez pas vérifier cette préférence « firstTime » vous » Ve sur la méthode OnCreate. Vous le définissez sur false après l'avoir vérifié, de sorte que MainActivity démarre comme si l'utilisateur était déjà connecté après la fermeture de l'application. Vous pouvez vérifier votre « datos » présence au lieu de « firstTime » oui – Daivid

+0

homme, mais dans la méthode logout i am sUPPrimer les sharedpreferences, et tournez à TRUE, vérifier ma méthode logout s'il vous plaît. – matQ

+0

Oui, mais vous ne définissez pas à vrai quand l'activité se termine par elle-même, êtes-vous? le commentaire de Nabis pourrait le réparer btw. – Daivid

Répondre

0

Je vois un problème dans votre logique, le QUICKFIX serait d'utiliser le code ci-dessous dans votre MainActivity:

boolean notFirstTime = sharedPreferences.getBoolean("firstTime" , false); 
if (! notFirstTime){ 
    SharedPreferences.Editor edit = ... 
+0

dans le cas, je shuold sauver modifier (firstTime, true) ?? – matQ

+0

Oui. changer aussi la clé « not_first_time » pour une meilleure lisibilité –

+0

. et la méthode logout, comment dois-je changer être logique avec les nouveaux changements? vous recomendme pour effacer ou pour enregistrer edit comme faux? – matQ