在我的应用中,我有以下代码告诉我默认情况下是否启用了某项功能:
public boolean getFeatureEnabled()
{
return mPrefs.getBoolean("FEATURE_ENABLED", DEFAULT_ENABLED);
}
仅当用户从UI更改设置时,才会覆盖此首选项。因此,默认情况下,它从DEFAULT_ENABLED
中获取值,这是一个类变量。
在当前版本中,DEFAULT_ENABLED
为true
,但在我的应用的下一个版本中将为false
。
问题是,在更新之后,使用上面的代码,没有从UI更改默认设置的旧用户将禁用其功能 - 我想避免这种情况。
有关如何处理此问题的任何建议吗?
答案 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,并且不会考虑默认值