Android: Как reset FirstRun SharedPreferences при обновлении моего приложения?
Мое приложение копирует файлы из res/raw в SD-карту при первом запуске. Я хочу, чтобы он обновлял эти файлы при каждом последующем обновлении приложения. Как это сделать reset предпочтение firstrun true для каждого обновления приложения?
Вот соответствующий код:
/**
* get if this is the first run
*
* @return returns true, if this is the first run
*/
public boolean getFirstRun() {
return mPrefs.getBoolean("firstRun", true);
}
/**
* store the first run
*/
public void setRunned() {
SharedPreferences.Editor edit = mPrefs.edit();
edit.putBoolean("firstRun", false);
edit.commit();
}
SharedPreferences mPrefs;
/**
* setting up preferences storage
*/
public void firstRunPreferences() {
Context mContext = this.getApplicationContext();
mPrefs = mContext.getSharedPreferences("myAppPrefs", 0); //0 = mode private. only this app can read these preferences
}
public void setStatus(String statustext) {
SharedPreferences.Editor edit = mPrefs.edit();
edit.putString("status", statustext);
edit.commit();
}
}
Ответы
Ответ 1
В моем приложении я сохраняю в своих общих настройках код версии приложения. При каждом запуске я проверяю, ниже ли код текущей версии кода сохраненной версии. Если это так, я покажу "новый" диалог.
Дайте этому коду вихрь - я использую его в своей основной деятельности onCreate:
PackageInfo pInfo;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
if ( prefs.getLong( "lastRunVersionCode", 0) < pInfo.versionCode ) {
// TODO: Handle your first-run situation here
Editor editor = prefs.edit();
editor.putLong("lastRunVersionCode", pInfo.versionCode);
editor.commit();
}
} catch (NameNotFoundException e) {
// TODO Something pretty serious went wrong if you got here...
e.printStackTrace();
}
prefs - частный объект SharedPreferences. Это работает, если это действительно первый запуск и обновление. В конце кода первого запуска editor.putLong обновляет ваши общие настройки с помощью текущего кода версии вашего приложения, поэтому следующий запуск не запускает ваш первый код.
Это также связано с тем, что ваш код версии должен увеличиваться, чтобы приложение рассматривалось как обновление на рынке, поэтому вам не нужно помнить об изменении отдельного значения для обнаружения первого запуска.
Ответ 2
Вы можете подражать тому, что сделано на стороне базы данных, с номерами версий. Вместо того, чтобы иметь только переменную firstRun
, иметь пару с firstRun
и versionNumber
и поместить в приложение статическое поле номера версии, которое вы увеличиваете в каждой версии. Таким образом, вы сможете проверить, обновлено ли приложение, и выполнять свою операцию при каждом обновлении.
Ответ 3
Я создаю для этого класс; скачать https://gist.github.com/2509913
Пример использования:
long versionInstalled = App.getVersionInstalled(this);
long current_v = App.getVersion(this);
if( versionInstalled != current_v ){
Log.w("TAG", "Veresion not valid");
}
Ответ 4
Запустите это в MainActivity OnCreate
public void onUpdateFirstRun () {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
PackageInfo pInfo;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
Log.d("VersionCode", pInfo.versionCode + " ");
if (prefs.getLong(LAST_RUN_VERSION_CODE_KEY, 0) < pInfo.versionCode) {
if (!isInitializedInSP(KEY)) {
editor.putString(KEY, "");
}
//Finalize and Save
editor.putLong(LAST_RUN_VERSION_CODE_KEY, pInfo.versionCode);
editor.apply();
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
Использовать метод для проверки того, что вы уже инициализировали его в предыдущей версии
public static boolean isInitializedInSP (String key) {
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContex());
Object o = mPrefs.getAll().get(key);
if (o != null) {
return true;
}
else {
return false;
}
}