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!