¿Hay alguna manera de hacer que SharedPreferences sea global en toda mi aplicación para Android?

¿Hay alguna manera de hacer que SharedPreferences sea global en toda mi aplicación? Ahora mismo estoy usando estas líneas en muchos lugares a lo largo de mi código para almacenar ajustes de encendido / apagado simples para una serie de preferencias que mis usuarios pueden establecer. Sólo quiero llamarlo una vez globalmente si es posible:

SharedPreferences settings = getSharedPreferences("prefs", 0); SharedPreferences.Editor editor = settings.edit(); 

Cualquier consejo sobre cómo ser capaz de llamar a estas líneas en todas las clases sería impresionante:

 editor.putString("examplesetting", "off"); editor.commit(); 

y

 String checkedSetting = settings.getString("examplesetting", ""); 

Lo sé, lo sé, me inflamaré y meteré en las cenizas del infierno …

Utilice una clase singleton que rodea la configuración de SharedPreference .. algo como esto:

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

Y crear funciones de wrapper alrededor de lo que representan sus ejemplos en la pregunta, por ejemplo,

PrefSingleton.getInstance().writePreference("exampleSetting", "off");

Y la implementación podría ser algo como esto:

 // Within Singleton class public void writePreference(String key, String value){ Editor e = mMyPreference.edit(); e.putString(key, value); e.commit(); } 

Desde su primera actividad, active la clase singleton, de esta manera, algo como esto:

 PrefSingleton.getInstance().Initialize(getApplicationContext()); 

La razón por la que me arriesgo a votar a la baja, es que el uso de clases estáticas globales puede ser una mala idea y va en contra de la práctica de los fundamentos de programación. PERO habiendo dicho eso, como nit-picky a un lado, se asegurará de que sólo el único objeto de la clase PrefSingleton puede existir y ser accesible independientemente de qué actividades está en el código.

Extendería la Application e incluiría SharedPreferences.Editor como un campo con un getter.

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

A continuación, puede acceder a ella desde cualquier Activity con

 ((APP) getApplication()).editSharePrefs().putString("examplesetting", "off"); ((APP) getApplication()).editsharePrefs().commit(); 

Alternativamente, también podría lanzar el método

  public static APP getAPP(Context context) { return (APP) context.getApplicationContext(); } 

Aunque, esto simplemente cambiaría las llamadas que usted hace a

 APP.getAPP(this).editSharePrefs().putString("examplesetting", "off"); APP.getAPP(this).editsharePrefs().commit(); 

Así que realmente es una preferencia personal, que se ve más limpia para usted.

Yo haría lo siguiente:

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

A continuación, puede acceder a sharedPrefs porque está protegido y luego es accesible a través del paquete.

 In the console you have : true <-- setInhistory 

Utilice una clase de ayudante para obtener todo lo que desee, hacer que los métodos sean estáticos. Así es como ADW lo hace.

Utilícelo para establecer la configuración:

 public static void SetCheckedSetting(Context context, String value) { SharedPreferences settings = getSharedPreferences("prefs", 0); SharedPreferences.Editor editor = settings.edit(); editor.putString("examplesetting", value); editor.commit(); } 

Y esto para conseguir el ajuste:

 public static String GetCheckedSetting(Context context) { SharedPreferences settings = getSharedPreferences("prefs", 0); return settings.getString("examplesetting", ""); } 

Para pasar el contexto simplemente puede utilizar this palabra clave.

Es importante que no almacene SharedPreferences como una variable estática. Si lo hace provoca una pérdida de memoria. Ver: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html

  • ¿Por qué Android no imprime el seguimiento de la pila?
  • Cómo agregar el diseño de fondo en el cuadro de diálogo Modal BottomSheet?
  • Android: ¿Cuál es el valor predeterminado de android: dividerHeight para una vista de lista
  • Fopen en el código JNI C falla en el archivo colocado en la carpeta de activos en la aplicación android
  • GSON: deserialización de objetos personalizados
  • ¿Podemos usar casi todos los paquetes estándar de Java en una aplicación Android?
  • Guardar en tarjeta SD como archivo de texto
  • Decodificar códigos de control remoto a través de la entrada de audio
  • ¿Cuál es la manera más simple de invertir un ArrayList?
  • Java.lang.RuntimeException: No se puede reanudar la actividad con java.lang.IllegalArgumentException
  • Error al iniciar la actividad Android Studio 2.1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.