119 votes

Déterminer si l'application Android est la première fois utilisée

Je développe actuellement une application Android. Je dois faire quelque chose lorsque l'application est lancée si c'est la première fois qu'elle est lancée, c'est-à-dire que le code ne fonctionne que la première fois que le programme est lancé.

Merci

117voto

harrakiss Points 416

Vous pouvez utiliser les SharedPreferences pour identifier si c'est la "première fois" que l'application est lancée. Utilisez simplement une variable booléenne ("my_first_time") et remplacez sa valeur par false lorsque votre tâche "première fois" est terminée.

Ceci est mon code pour attraper la première fois que vous ouvrez l'application:

 final String PREFS_NAME = "MyPrefsFile";

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);

if (settings.getBoolean("my_first_time", true)) {
    //the app is being launched for first time, do something        
    Log.d("Comments", "First time");

             // first time task

    // record the fact that the app has been started at least once
    settings.edit().putBoolean("my_first_time", false).commit(); 
}
 

64voto

schnatterer Points 730

Je suggère non seulement de stocker un indicateur booléen, mais la version complète du code. De cette façon, vous pouvez également interroger au début si c'est le premier démarrage dans une nouvelle version. Vous pouvez utiliser ces informations pour afficher un "Quoi de neuf" de dialogue, par exemple.

Le code suivant devrait fonctionner à partir d'android classe que "c'est un contexte" (activités, services, ...). Si vous préférez l'avoir dans un document distinct (POJO) de la classe, vous pourriez envisager d'utiliser un "contexte statique", comme décrit ici par exemple.

/**
 * Distinguishes different kinds of app starts: <li>
 * <ul>
 * First start ever ({@link #FIRST_TIME})
 * </ul>
 * <ul>
 * First start in this version ({@link #FIRST_TIME_VERSION})
 * </ul>
 * <ul>
 * Normal app start ({@link #NORMAL})
 * </ul>
 * 
 * @author schnatterer
 * 
 */
public enum AppStart {
    FIRST_TIME, FIRST_TIME_VERSION, NORMAL;
}


// Note: These variables need to be initialized see below
private Context context;
private SharedPreferences sharedPreferences;

/**
 * The app version code (not the version name!) that was used on the last
 * start of the app.
 */
private static final String LAST_APP_VERSION = "last_app_version";

/**
 * Caches the result of {@link #checkAppStart()}. To allow idempotent method
 * calls.
 */
private static AppStart appStart = null;

/**
 * Finds out started for the first time (ever or in the current version).
 * 
 * @return the type of app start
 */
public AppStart checkAppStart() {
    if (appStart == null) {
        PackageInfo pInfo;
        try {
            pInfo = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), 0);
            int lastVersionCode = sharedPreferences.getInt(
                    LAST_APP_VERSION, -1);
            // String versionName = pInfo.versionName;
            int currentVersionCode = pInfo.versionCode;
            appStart = checkAppStart(currentVersionCode, lastVersionCode);
            // Update version in preferences
            sharedPreferences.edit()
                    .putInt(LAST_APP_VERSION, currentVersionCode).commit();
        } catch (NameNotFoundException e) {
            Log.w(Constants.LOG,
                    "Unable to determine current app version from pacakge manager. Defenisvely assuming normal app start.");
        }
    }
    return appStart;
}

public AppStart checkAppStart(int currentVersionCode, int lastVersionCode) {
    if (lastVersionCode == -1) {
        return AppStart.FIRST_TIME;
    } else if (lastVersionCode < currentVersionCode) {
        return AppStart.FIRST_TIME_VERSION;
    } else if (lastVersionCode > currentVersionCode) {
        Log.w(Constants.LOG, "Current version code (" + currentVersionCode
                + ") is less then the one recognized on last startup ("
                + lastVersionCode
                + "). Defenisvely assuming normal app start.");
        return AppStart.NORMAL;
    } else {
        return AppStart.NORMAL;
    }
}

Il pourrait être utilisé à partir d'une activité de ce genre:

public class MainActivity extends Activity {

    private Context context;
    private SharedPreferences sharedPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(context);

        switch (checkAppStart()) {
        case NORMAL:
            // We don't want to get on the user's nerves
            break;
        case FIRST_TIME_VERSION:
            // TODO show what's new
            break;
        case FIRST_TIME:
            // TODO show a tutorial
            break;
        default:
            break;
        }

        // ...
    }
    // ...
}

La logique de base peut être vérifié à l'aide de ce test JUnit:

public void testCheckAppStart() {
    // First start
    int oldVersion = -1;
    int newVersion = 1;
    assertEquals("Unexpected result", AppStart.FIRST_TIME,
            service.checkAppStart(newVersion, oldVersion));

    // First start this version
    oldVersion = 1;
    newVersion = 2;
    assertEquals("Unexpected result", AppStart.FIRST_TIME_VERSION,
            service.checkAppStart(newVersion, oldVersion));

    // Normal start
    oldVersion = 2;
    newVersion = 2;
    assertEquals("Unexpected result", AppStart.NORMAL,
            service.checkAppStart(newVersion, oldVersion));
}

Avec un peu plus d'effort, vous pourriez probablement tester le android les choses liées (PackageManager et SharedPreferences). Quiconque s'intéresse à l'écriture de l'essai? :)

Notez que le code ci-dessus ne fonctionnera correctement que si vous ne jouez pas avec votre android:versionCode dans AndroidManifest.xml!

59voto

Kevin Dion Points 2061

Une autre idée consiste à utiliser un paramètre dans les préférences partagées. Même idée générale que de rechercher un fichier vide, mais vous n'avez pas de fichier vide qui flotte, qui ne sert à rien.

2voto

Das Points 2137

Voici un code pour cela -

 String path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/Android/data/myapp/files/myfile.txt";

boolean exists = (new File(path)).exists(); 

if (!exists) {
    doSomething();                                      
}
else {
    doSomethingElse();
}
 

1voto

MechMK1 Points 500

Vous pouvez simplement vérifier l'existence d'un fichier vide, s'il n'existe pas, puis exécuter votre code et créer le fichier.

par exemple

 if(File.Exists("emptyfile"){
    //Your code here
    File.Create("emptyfile");
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X