Android设备重启后的SharedPreferences

6

因为我是俄罗斯人,所以我的英语非常非常糟糕。

在我的应用程序中,我使用SharedPreferences来存储我的值。当应用程序运行时,数据被存储在SharedPreferences中,在退出应用程序后也是如此。一切正常,直到我重新启动设备。重新启动后,我无法使用SharedPreferences,应用程序无法读取和写入其中的数据。我使用函数getPreferences(0)从应用程序数据文件夹中获取首选项。我还尝试使用getSharedPreferences(myPref, MODE_PRIVATE),但效果相同。唯一的解决方案是在重新启动设备后清除应用程序中的数据。

    favoriteButton = (ImageView) findViewById(R.id.favorite_button);
    SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE);
    if(favorite.getString(""+Loader.currentVideo.getTitle()+"", "") == "true") {
        favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected));
    } else {
        favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty));
    }
    favoriteButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE);
            SharedPreferences.Editor editor = favorite.edit();
            if(favorite.getString(""+Loader.currentVideo.getTitle()+"", "") == "true") {
                favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty));
                Loader.favoriteVideos.remove(Loader.currentVideo);
                editor.remove(""+Loader.currentVideo.getTitle()+"");
            } else {
                favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected));
                Loader.favoriteVideos.add(Loader.currentVideo);
                editor.putString(""+Loader.currentVideo.getTitle()+"", "true");
            }
            editor.commit();
        }
    });

1
这是由于SharedPreferences在重启时被杀死。请查看数据存储选项 - Cdr. Powell
2
@Cdr. Powell -- SharedPreferences 存储在闪存驱动器上的文件中,重新启动不会影响该文件。 - mah
1
BarkovAndrey - 正如@Ankit所说,请展示你的代码。具体来说,我想知道你是否调用了SharedPreferences commit()方法,该方法是完成你的更改所必需的。 - mah
我改正了。抱歉误导了。 - Cdr. Powell
我重申一遍,一切都正常工作,直到我重新启动设备或重新安装应用程序。解决方法是清除应用程序数据。 - BarkovAndrey
显示剩余2条评论
3个回答

2
感谢大家的建议!但我已经解决了这个问题!希望这个解决方案能帮到其他人。
在请求SharedPreferences中的值之前,请检查key是否可用!
示例代码:
SharedPreferences sharedpreferences = getSharedPreferences("SharedPreferences", MODE_PRIVATE); sharedpreferences.contains("key") // 检查key是否存在
    favoriteButton = (ImageView) findViewById(R.id.favorite_button);
    SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE);
    String tempFav = "";
    if(favorite.contains(""+Loader.currentVideo.getTitle()+"")) {
        tempFav = favorite.getString(""+Loader.currentVideo.getTitle()+"", "");
    }
    if(tempFav.equalsIgnoreCase("true")) {
        favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected));
    } else {
        favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty));
    }
    favoriteButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE);
            SharedPreferences.Editor editor = favorite.edit();
            String tempCFav = "";
            if(favorite.contains(""+Loader.currentVideo.getTitle()+"")) {
                tempCFav = favorite.getString(""+Loader.currentVideo.getTitle()+"", "");
                Log.d(Loader.currentVideo.getTitle());
                Log.d(tempCFav);
            }
            if(tempCFav.equals("true")) {
                favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty));
                Loader.favoriteVideos.remove(Loader.currentVideo);
                editor.remove(""+Loader.currentVideo.getTitle()+"");
            } else {
                favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected));
                Loader.favoriteVideos.add(Loader.currentVideo);
                editor.putString(""+Loader.currentVideo.getTitle()+"", "true");
            }
            editor.commit();
        }
    });

如果收藏的字符串中包含“subscribe”和“unsubscribe”等单词,那么.contains方法将返回true。请参阅我的答案:http://stackoverflow.com/questions/36939380/android-persistent-checkable-menu-in-custom-widget-after-reboot-android/36998250#36998250 - iOSAndroidWindowsMobileAppsDev

0
以下代码应该能帮助您保存共享首选项。重要部分是edit.commit(); 如果这样做不起作用,那么您使用的手机可能具有某些不同的行为,因为手机制造商可能已经修改了一些东西。
private static final String PREFERENCES = "Preferences";
static protected SharedPreferences getSharedPreferences( Context context ) {

    return context.getSharedPreferences( PREFERENCES, Context.MODE_PRIVATE);
}

public void setString(String setting, String value) {

    SharedPreferences settings = getSharedPreferences( getApplicationContext() );
    Editor edit = settings.edit();
    edit.putString(setting, value);
    edit.commit();
}

这是有效的,我可以在应用程序未运行时在数据文件夹中看到具有首选项的文件,并在重新启动设备后看到此文件! - BarkovAndrey
但是只有在重新启动我的设备之后,我的应用程序才能看到这个文件。 - BarkovAndrey
这个文件仍然保存着我的值,但是当我在设备重启后调用getPreferences()时,无法获取并写入这个文件。我解决了这个问题 - 在重启后清除了我的应用程序数据。 - BarkovAndrey
对不起 - 我的英语非常非常糟糕!(((我是俄罗斯人。 - BarkovAndrey
你使用的是哪个设备?我觉得设备有些问题。你使用的是自定义 ROM 还是官方 ROM?安卓版本是多少? - vipsy

0
将以下代码添加到清单应用标签中:
android:allowBackup="true" android:fullBackupContent="true"

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