升级时更改默认偏好设置

3

在我的应用中,我有以下代码可以告诉我一个功能是否默认启用:

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

这个偏好设置只有在用户从UI更改设置时才会被覆盖。因此,默认情况下它的值来自于“DEFAULT_ENABLED”,该变量是某个类变量。

在当前版本中,“DEFAULT_ENABLED”为“true”,但在我的应用的下一个版本中将变为“false”。

问题在于,在更新后,使用上述代码的旧用户(未从UI更改默认设置)将禁用其功能 - 我想避免这种情况发生。

对于如何处理这个问题,有什么建议吗?

2个回答

2

据我了解,您有一个默认启用的功能,但除非用户明确更改,否则此默认值从未写入SharedPreferences。现在,您希望该功能默认禁用,但不会影响已启用该功能的用户的行为。

我可以想到3个选项:

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

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

然而,这取决于您的应用启动代码中是否已经调用了此方法。

选项2 如果没有调用,仍有希望。您可以使用此StackOverflow答案中提供的答案检查是否为首次安装。

选项3 您可以发布一个中间版本的应用程序,其行为与现在相同,但将未保存的默认设置保存在SharedPreferences中。这将保持功能不变,以满足您急切的用户需求,但在发布所需行为之前,您必须等待大部分用户更新。


0
在你的新构建中,在preferences中添加另一个名为"FIRST_TIME"的标志,并将其设置为"true"。然后在你的应用程序的第一个屏幕上检查它。
if(FIRST_TIME==true)
 {
 //put FEATURE_ENABLED = false;
 //put FIRST_TIME = false;

 }

通过这样做,FEATURE_ENABLED 将在用户首次启动应用程序时设置为 false,并且不会考虑默认值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接