2016-12-06 12 views
1

В моем приложении для Android я могу отображать всплывающее окно при обновлении приложения (на основе versionCode). Во всплывающем окне я поставил чекбокс с надписью «не показывать мне снова». Когда я нажму на это, он сохранит в sharedprefversionCode и больше не будет отображать всплывающее окно.Android SharedPref не сохраняется при перезапуске

Я столкнулся с чем-то странным поведением, когда, когда я сохраняю новый Set<String>, он действительно сохранял его, но когда мое приложение перезагружается, настройки теряются.

Set<String> readAnnouncement = getReadAnnouncement(this); 
readAnnouncement.add(String.valueOf(versionCode)); 
PreferenceManager.getDefaultSharedPreferences(this).edit().putStringSet(KEY_READ_ANN, readAnnouncement).apply(); 

Если я нарушу точку на readAnnouncement.add, я могу установить, например, список, имеющий 2 пунктов. Когда я выполняю PreferenceManager.getDefaultSharedPrefer..., а затем выполняю getReadAnnouncement(this);, значение есть, все хорошо.

Если я перезапущу приложение и снова проведу getReadAnnouncement(this);, новое значение исчезнет.

Освободив кеш, проблема исчезла ... Почему это не спасло? Возможно ли заполнение SharedPreference?

ответ

0

Попробуйте вот так.

import android.content.Context; 
import android.content.SharedPreferences; 
/** 
* @author VIVEK 
*   This class deals in with setting Cache value for complete app. 
*/ 
public class SharedPrefUtil{ 

    /*Set Boolean value in shared preferences */ 
    public static void setSharedPref(Context context, String key, boolean value) { 
     // save token in preference 
     SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putBoolean(key, value); 
     editor.commit(); 
    } 

    /*get Boolean value in shared preferences */ 
    public static boolean getSharedPref(Context context, String key, boolean defaultVal) { 
     boolean prefToken = defaultVal; 
     SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0); 
     prefToken = sharedPreferences.getBoolean(key, false); 
     return prefToken; 
    } 

    /*Set String value in shared preferences */ 
    public static void setSharedPref(Context context, String key, String value) { 
     // save token in preference 
     SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, value); 
     editor.commit(); 
    } 

    /*get String value in shared preferences */ 
    public static String getSharedPref(Context context, String key, String defaultVal) { 
     String value = defaultVal; 
     SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0); 
     value = sharedPreferences.getString(key, defaultVal); 
     return value; 
    } 

    public static void cleanSharedPrefFile(Context context) { 
     // save token in preference 
     SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.clear(); 
     editor.commit(); 
    } 

} // End of main class over here ... 

Теперь вы хотите установить какое-то значение в общей Pref затем установить, как этот

SharedPrefUtil.setSharedPref(MainActivity.this, "test", storeBuff); 

Теперь, когда вам нужно получить значение из общего Pref затем вызвать как этот

SharedPrefUtil.getSharedPref(MainActivity.this, "test", "default value"); 

В место editor.commit(), использование editor.apply()

ОСНОВЫ:

getDefaultSharedPreferences() использует имя файла предпочтения по умолчанию. Это значение по умолчанию устанавливается для каждого приложения, поэтому все действия в том же контексте, приложение может получить доступ к нему легко, как в следующем примере:

SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this); 
if (spref.contains("email")) { 
    String sEmailAddr = spref.getString("email", ""); 
} 

Предпочтение, как правило, хранятся в /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml

Альтернативный метод - getSharedPreferences (имя , mode) требует указания конкретного имени предпочтения (файла) и режима работы (например, private, world_readable и т. д.), которые позволяют получить лучший доступ к вашему файлу SharedPref.

+0

Я не собираюсь просто копировать прошлый слепой случайный код, не понимая, в чем причина проблемы. – Johny19

+0

Обновить полный класс по SO – AndroidHacker

+0

Извините, я не могу принять это. В любом случае он не отвечает на исходный вопрос. Мне не нужен код. Мне нужен ответ на вопрос о том, почему pref теряется после перезагрузки. – Johny19