在升级时更改默认首选项

时间:2016-09-15 11:05:48

标签: android sharedpreferences upgrade

在我的应用中,我有以下代码告诉我默认情况下是否启用了某项功能:

public boolean getFeatureEnabled()
{
    return mPrefs.getBoolean("FEATURE_ENABLED", DEFAULT_ENABLED);
}

仅当用户从UI更改设置时,才会覆盖此首选项。因此,默认情况下,它从DEFAULT_ENABLED中获取值,这是一个类变量。

在当前版本中,DEFAULT_ENABLEDtrue,但在我的应用的下一个版本中将为false

问题是,在更新之后,使用上面的代码,没有从UI更改默认设置的旧用户将禁用其功能 - 我想避免这种情况。

有关如何处理此问题的任何建议吗?

2 个答案:

答案 0 :(得分:2)

据我了解,您有一项默认启用的功能,但除非用户明确更改,否则此默认值永远不会写入@keyframes myAnimation{ 0%{ opacity: 1; transform: rotateX(90deg); } 50%{ opacity: 0.5; transform: rotateX(0deg); } 100%{ display: none; opacity: 0; transform: rotateX(90deg); } } #myelement{ animation-name: myAnimation; animation-duration: 2000ms; animation-fill-mode: forwards; } 。 现在,您希望默认情况下禁用该功能,但不会影响已启用该功能的用户的行为。

我可以想到3个选项:

选项1 如果您已经保存了上一个版本,可以在迁移逻辑中检查:

SharedPreferences

然而,这取决于您的已经在您的应用启动代码中的某处调用此方法。

选项2 如果你不这样做,仍有希望。您可以使用in this StackOverflow answer

给出的答案检查这是否是您的首次安装

选项3 您可以发布应用的中间版本,其行为与现在一样,但会保存private void migratePreferences(Context context) { SharedPreferences prefs = context.getSharedPreferences("your_preference_file", MODE_PRIVATE); int lastKnownVersionCode = (prefs.getInt("LAST_INSTALLED_VERSION", BuildConfig.VERSION_CODE); prefs.edit().putInt("LAST_INSTALLED_VERSION", BuildConfig.VERSION_CODE).apply(); //this is the old featureEnabled check boolean oldPreferenceValue = prefs.getBoolean("FEATURE_ENABLED", true); boolean newPreferenceValue; if (prefs.contains("FEATURE_ENABLED")) { //the feature was modified by the user so respect their preference newPreferenceValue = prefs.getBoolean("FEATURE_ENABLED", false); } else if (lastKnownVersionCode == BUGGY_VERSION_WITH_FEATURE_ENABLED_BY_DEFAULT) { //the user is updating from the buggy version. // this check could include a range of versions if you've released several buggy versions. // this is also where option 2 would be inserted newPreferenceValue = oldPreferenceValue; } else { //the new default that will apply to fresh installs newPreferenceValue = false; } //save the preference prefs.edit().putBoolean("FEATURE_ENABLED", newPreferenceValue).apply(); } 中未保存的默认设置。这将使您的热心用户保持该功能,但您必须等到大部分用户更新才能发布所需的行为。

答案 1 :(得分:0)

在新版本的FIRST_TIME中将另一个标记“true”设置为“preferences”。检查应用的第一个屏幕

if(FIRST_TIME==true)
 {
 //put FEATURE_ENABLED = false;
 //put FIRST_TIME = false;

 }

通过执行此操作FEATURE_ENABLED将在用户首次启动应用时设置为false,并且不会考虑默认值