text: Q:
  
  Inicializar SharedPreferences desde una clase que no extiende de activity
  
  Estoy intentando que una app se autoinicie al encender el dispositivo siempre y cuando así lo quiera el usuario. Para ello, guardo el valor de una variable mediante SharedPreference. El problema es que para ello uso unos métodos de Leer y Guardar, que al estar en MainActivity, deben estar en el MainActivity: 
  public class MainActivity extends Activity //implements View.OnClickListener
  {
   static SharedPreferences datos;
      @Override
      protected void onCreate(Bundle savedInstanceState)
      {
  (...)
   datos= getPreferences(this.MODE_PRIVATE);
  (...)
      } 
  
  public static void Guardar(String guardado, String fichero)
          {
              SharedPreferences.Editor editor=datos.edit();
              editor.putString(fichero, guardado);
              editor.commit();
          }
  
          public static String Leer(String fichero)
          {
              String e=datos.getString(fichero, "" );
              return e;
          }
  
  La clase en la que uso es método de leer para saber si el usuario ha elegido o no la opción de autoarranque es la siguiente:
   public class Monitor extends BroadcastReceiver
  {
      @Override
      public void onReceive(Context context, Intent intent)
      {
          String auto= MainActivity.Read("auto");
         if(auto.equals("true"))
         {
              Intent i = new Intent(context, MainActivity.class);
              i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              context.startActivity(i);
         }
      }
  }
  
  El problema es que trata de ejecutar el método leer desde Monitor al empezar su ejecución, pero al intentar hacer esto, la app se para debido a que datos está sin inicializar, puesto que no se inicializa en el propio método, sino en el onCreate del MainActivity, que aún no se ha ejecutado. No obstante, no puedo meterlo en el método debido a que este debe ser static para poder usarlo en otras clases, por lo que no puedo pasarle el context al método. Por otra parte, intenté crear los métodos Guardar() y Leer() en la clase Monitor, pero tampoco puedo, ya que me da error al intentar usar getPreferences().
  ¿Qué puedo hacer? ¿Hay alguna manera de usar SharedPreferences en este caso? Y, en caso de que no la haya, ¿Cómo podría almacenar la decisión del usuario de una ejecución a otra?
  
  A:
  
  En un Broadcasteceiver el método onReceive(), recibe el contexto el cual puedes utilizar para obtener tu prefefencia:
  onReceive (Context context, Intent intent)
  
  Define dentro de tus métodos, el nombre de la preferencia e instancia SharedPreferences dentro de cada método:
  private String PREFS_KEY = "mispreferencias";
  
  public static void guardarValor(Context context, String keyPref, String valor) {
      SharedPreferences settings = context.getSharedPreferences(PREFS_KEY, MODE_PRIVATE);
      SharedPreferences.Editor editor;
      editor = settings.edit();
      editor.putString(keyPref, mostrar);
      editor.commit();
  }
  
  public static String obtenerValor(Context context, String keyPref) {
      SharedPreferences preferences = context.getSharedPreferences(PREFS_KEY, MODE_PRIVATE);
      return  preferences.getString(keyPref, "");
  }
  
  Sugiero uses el contexto para llamar los métodos, por ejemplo Leer () dentro de tu BroadcastReceiver:
  obtenerValor(context, "auto");
  
  