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;
    }

}