Есть ли способ сделать SharedPreferences глобальным во всем моем приложении для Android?
Есть ли способ сделать SharedPreferences глобальным во всем моем приложении? Сейчас я использую эти строки во многих местах всего своего кода, чтобы хранить простые настройки включения/выключения для ряда настроек, которые могут быть установлены моими пользователями. Я просто хочу назвать их когда-нибудь глобально, если это возможно:
SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();
Любые подсказки о том, как иметь возможность вызывать только эту строку во всех классах, были бы замечательными:
editor.putString("examplesetting", "off");
editor.commit();
и
String checkedSetting = settings.getString("examplesetting", "");
Ответы
Ответ 1
Я знаю, я знаю, я буду воспален и брошен в уголки ада....
Используйте одноэлементный класс, который обтекает настройки SharedPreference
.. что-то вроде этого:
public class PrefSingleton{
private static PrefSingleton mInstance;
private Context mContext;
//
private SharedPreferences mMyPreferences;
private PrefSingleton(){ }
public static PrefSingleton getInstance(){
if (mInstance == null) mInstance = new PrefSingleton();
return mInstance;
}
public void Initialize(Context ctxt){
mContext = ctxt;
//
mMyPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
}
}
И создайте функции-обертки вокруг того, что представлены ваши примеры в вопросе, например
PrefSingleton.getInstance().writePreference("exampleSetting", "off");
и реализация может быть примерно такой:
// Within Singleton class
public void writePreference(String key, String value){
Editor e = mMyPreference.edit();
e.putString(key, value);
e.commit();
}
С вашего первого действия активируйте класс singleton таким образом, что-то вроде этого:
PrefSingleton.getInstance().Initialize(getApplicationContext());
Причина, по которой я рискую голосом, - использовать глобальные статические классы, может быть плохой идеей и идет вразрез с практикой фундаментальных принципов программирования. НО, сказав, что, как ничтожный в стороне, он гарантирует, что только один и только объект класса PrefSingleton
может существовать и быть доступен независимо от того, какие действия он выполняет.
Ответ 2
Я бы расширил Application
и включил SharedPreferences.Editor
в качестве поля с геттером.
public class APP extends Application {
private final SharedPreferences settings = getSharedPreferences("prefs", 0);
private final SharedPreferences.Editor editor = settings.edit();
public SharedPreferences.Editor editSharePrefs() {
return editor;
}
}
Затем вы можете получить к нему доступ из любого Activity
с помощью
((APP) getApplication()).editSharePrefs().putString("examplesetting", "off");
((APP) getApplication()).editsharePrefs().commit();
В качестве альтернативы вы также можете использовать метод
public static APP getAPP(Context context) {
return (APP) context.getApplicationContext();
}
Хотя это просто изменит ваши вызовы на
APP.getAPP(this).editSharePrefs().putString("examplesetting", "off");
APP.getAPP(this).editsharePrefs().commit();
Таким образом, это действительно личное предпочтение, которое выглядит более чистым для вас.
Ответ 3
Я бы сделал следующее:
public class BaseActivity extends Activity {
protected boolean setInHistory;
protected SharedPreferences sharedPrefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
setInHistory = true;
}
}
public class MainActivity extends BaseActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println(setInHistory+" <-- setInhistory");
}
}
Затем можно получить доступ к sharedPrefs, потому что он защищен, а затем доступен через пакет.
In the console you have : true <-- setInhistory
Ответ 4
Используйте класс помощника, чтобы получить все, что хотите, сделать методы static.This, как ADW делать.
Ответ 5
Используйте это, чтобы установить настройку:
public static void SetCheckedSetting(Context context, String value)
{
SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("examplesetting", value);
editor.commit();
}
И чтобы получить настройку:
public static String GetCheckedSetting(Context context)
{
SharedPreferences settings = getSharedPreferences("prefs", 0);
return settings.getString("examplesetting", "");
}
Чтобы передать контекст, вы можете просто использовать ключевое слово this
.
Важно, чтобы вы не сохраняли SharedPreferences
как статическую переменную. Если вы это сделаете, это приведет к утечке памяти. См.: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html