0

Salut J'essaie de détecter si mon application a été ouverte pour la première fois. Si c'est le cas, j'ai besoin de lancer une activité et une fois qu'elle est ouverte pour la deuxième fois, elle ne devrait plus l'afficher.Android en utilisant les préférences partagées pour vérifier la première fois

Ceci est mon code:

fragment:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
    //startActivity(intent); 

    SharedPreferences settings = this.getActivity().getSharedPreferences(PREFS_NAME, 0); // Get preferences file (0 = no option flags set) 
    boolean firstRun = settings.getBoolean("firstRun", true); // Is it first run? If not specified, use "true" 

    if(firstRun) { 
     Log.w("onCreate: ","first time"); 
     Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
     startActivity(intent); 

     SharedPreferences.Editor editor = settings.edit(); // Open the editor for our settings 
     editor.putBoolean("firstRun", false); // It is no longer the first run 
     editor.apply(); // Save all changed settings 
    } else { 
     Log.w("onCreate: ","second time"); 
     Intent intent = new Intent(getActivity(), MainActivity.class); 
     startActivity(intent); 
    } 

    getSpecials(); 
} 

Mais tout ce qu'il fait est de commencer l'activité et quand je commence à nouveau il gèle dans un écran blanc, mais vérifier les journaux qu'il montre comme le autre instruction est constamment en cours d'exécution encore et encore. Je suis relativement nouveau sur Android, donc de l'aide ou des conseils seraient grandement appréciés

+0

vous devez utiliser editor.commit(); pour enregistrer les modifications – gaurang

+0

Puis-je demander quelle est l'utilisation de 'getActivity(). finish()'? C'est la différence que je vois entre le premier et le deuxième passage. et il se peut que cela vous ramène la classe où vous vérifiez la première course et vous entrez dans une boucle sans fin ?! – Nico

+0

Quand j'utilise editor.commit(); ou appliquer je reçois toujours le même résultat, aussi l'ide me dit que je devrais utiliser appliquer au lieu de commettre mais même problème. – thaabitv

Répondre

0

Essayez cette approche:

public class MainActivity extends Activity { 

    SharedPreferences prefs = null; 

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

     prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
    } 

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

     if (prefs.getBoolean("firstRun", true)) { 
      Intent intent = new Intent(MainActivity.this, TutorialFeaturedActivity.class); 
      startActivity(intent); 
      prefs.edit().putBoolean("firstRun", false).commit(); 
     } 
     else 
     { 
      //do nothing 
     } 

     getSpecials(); 
    } 
} 
+0

cela fonctionne parfaitement, mais quand je l'ajoute dans la prochaine activité que je montre un écran de coupure, ça ne marche pas de la même façon, de toute façon pour que ça marche de la même façon dans plusieurs activités? – thaabitv

1

Il semble que votre activité soit en boucle car dans votre instruction else, vous lui dites de redémarrer l'activité qui se retrouve dans l'instruction else et ainsi de suite etc.

+0

Je suis d'accord .. quelque chose comme ceci se produit - SharedPreferences n'est pas le problème. Cela aurait du sens si le fragment dans le code OP est attaché à MainActivity. –

0

Essayez d'utiliser editor.commit si editor.apply ne fonctionne pas

editor.putBoolean("firstRun", false); 
editor.apply(); // Save all changed settings 
editor.commit(); // Save all changed settings 
+0

Comme mentionné dans les commentaires ci-dessus, il n'y a pas de différence entre ces deux autres que l'asynchronisme. OP a également déclaré que le changement n'a pas résolu le problème. – Nico

+0

Je sais qu'il n'y a pas de diff b/w appliquer et commettre – Pehlaj

+0

Je pense que "aucune différence" est trompeuse. éditeur.commit() enregistre les modifications immédiatement tandis que editor.apply() enregistre en arrière-plan. –

0

Dans d'autre cas, votre départ "MainActivity.class". Pourquoi votre chargement MainActivity de l'oncreate de MainActivity? il fera une boucle.

Supprime l'activité de démarrage de l'autre cas.

0
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    SharedPreferences pref = YourActivityName.this.getSharedPreferences(PREFS_NAME,0); 
    SharedPreferences.Editor editor= pref.edit(); 
    boolean firstRun = pref.getBoolean("firstRun", true); 
    if(firstRun) 
    { 
     Log.i("onCreate: ","first time"); 
     editor.putBoolean("firstRun",false); 
     editor.commit(); 
     Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
     startActivity(intent); 
    } 
    else 
    { 
     Log.i("onCreate: ","second time"); 
     Intent intent = new Intent(getActivity(), MainActivity.class); 
     startActivity(intent); 

    } 
    // getSpecials(); 
} 
0

S'il vous plaît Essayez ce mon ami

public class SessionManager { 

private static String TAG = SessionManager.class.getSimpleName(); 

SharedPreferences pref; 
SharedPreferences.Editor editor; 
Context _context; 

// Shared pref mode 
int PRIVATE_MODE = 0; 

// Shared preferences file name 
private static final String PREF_NAME = "ManageRun"; 

private static final String KEY_IS_RUN = "isRun"; 


public SessionManager(Context context) { 
    this._context = context; 
    pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); 
    editor = pref.edit(); 
} 

public void setLatest(boolean isRun) { 

    editor.putBoolean(KEY_IS_RUN, isRun); 
    // commit changes 
    editor.commit(); 
    Log.d(TAG, "Manage Version session modified!"); 
} 

public boolean isLatest() { 
    return pref.getBoolean(KEY_IS_RUN, true); 
} 
} 

** Dans la première activité Check **

private SessionManager session; 


session = new SessionManager(getApplicationContext()); 

if (session.isLatest()) { 
    session.setLatest(false); 
    Log.w("onCreate: ","first time"); 
    Intent intent = new Intent(getActivity(), TutorialFeaturedActivity.class); 
    startActivity(intent); 
} 
else 
{ 
    Log.w("onCreate: ","second time"); 
    Intent intent = new Intent(getActivity(), MainActivity.class); 
    startActivity(intent); 
} 
+0

Est-ce que cela peut être fait dans plusieurs activités? @Ratilal – thaabitv

+0

plusieurs activités signifie? –

+0

je pense im ayant un problème avec le code im essayant d'utiliser le code dans une autre activité aussi mais puisque la préférence est en train d'être sauvegardé dans la première exécution de l'activité elle ne montre pas dans le prochain. – thaabitv

0
private boolean isFirstTime() { 
     if (firstTime == null) { 
      SharedPreferences mPreferences = this.getSharedPreferences("first_time", Context.MODE_PRIVATE); 
      firstTime = mPreferences.getBoolean("firstTime", true); 
      if (firstTime) { 
       SharedPreferences.Editor editor = mPreferences.edit(); 
       editor.putBoolean("firstTime", false); 
       editor.commit(); 
      } 
     } 
     return firstTime; 
    } 



if (isFirstTime()) { 

        Intent i = new Intent(SplashActivity.this, Intro_slider.class); 
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(i); 
        finish(); 

       } else { 
        final UserFunctions uf = new UserFunctions(); 
        if (uf.isUserLoggedIn(SplashActivity.this)) { 
         Intent i = new Intent(SplashActivity.this, MainActivity.class); 
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(i); 
         finish(); 
        } else { 
         Intent i = new Intent(SplashActivity.this, Social_Login_Activity.class); 
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(i); 
         finish(); 
        } 
       } 

Essayez ce code.