Android: uso de sharedPreferences en un receptor de difusión

Estoy tratando de crear una aplicación que activará un mensaje de brindis si el teléfono recibe un SMS que contiene una cadena que se almacena en las preferencias predeterminadas. Mi problema es que estoy teniendo problemas para que el brindis aparezca cuando se reciba el SMS. He probado mi código para el receptor con una cadena declarada y funciona, pero cuando utilizo la preferencia almacenada uno, no aparece. Aquí está mi código de ejemplo:

public class Main extends Activity{ private static final int RESULT_SETTINGS = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); display(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_settings: Intent i = new Intent(this, Settings.class); startActivityForResult(i, RESULT_SETTINGS); break; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case RESULT_SETTINGS: display(); break; } } private void display(){ TextView displayv = (TextView) findViewById(R.id.mysettings); SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); // codes that display } 

Y aquí está el receptor

 public class WakeSMS extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ SharedPreferences sharedPrefs = context.getSharedPreferences("sharedPrefs", context.MODE_PRIVATE); String trigger=sharedPrefs.getString("smsstr","NULL"); Bundle bundle = intent.getExtras(); SmsMessage[] msgs = null; String str= "SMS from"; if(bundle != null){ Object[] pdus =(Object[])bundle.get("pdus"); msgs=new SmsMessage[pdus.length]; for (int i = 0; i<msgs.length; i++){ msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); if(i==0){ str+= msgs[i].getOriginatingAddress(); str+=": "; } str+=msgs[i].getMessageBody().toString(); } if(str.contains(trigger)){ Toast.makeText(context, str, Toast.LENGTH_LONG).show(); } } }} 

En mi actividad principal, puedo obtener mi código para mostrar los prefs, pero en el receptor no puede activar el brindis. ¿Hay algo que estoy haciendo mal? (Mi receptor se llama WakeSMS porque se supone que debe activar una alarma en el futuro, pero ahora mismo sólo quiero que para activar un brindis por la prueba)

Edit: Tengo la sensación de que la forma en que he declarado mis preferencias en mi código es tal vez apagado, pero estoy en una pérdida tratando de averiguar lo que estoy haciendo mal ya que los valores de las preferencias se pueden mostrar en la principal actividad, pero no se puede utilizar en el receptor.

getDefaultSharedPreferences() devuelve un archivo SharedPreferences con el nombre basado en el paquete de la aplicación. Es como decir

 context.getSharedPreferences("com.your.package_preferences", context.MODE_PRIVATE); 

Entonces en su receptor usted dice

 context.getSharedPreferences("sharedPrefs", context.MODE_PRIVATE); 

que le permite compartir las preferencias con un nombre diferente.

Por lo tanto, está guardando en un archivo SharedPreference pero intentando recuperarlo desde otro.

Trate de usar

 getSharedPreferences("MySmsSharedPrefs", context.MODE_PRIVATE); 

en guardar y restaurar. es decir, en la Actividad y el Receptor


Aquí está la salsa para confirmar: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/preference/PreferenceManager.java

 ** * Gets a SharedPreferences instance that points to the default file that is * used by the preference framework in the given context. * * @param context The context of the preferences whose values are wanted. * @return A SharedPreferences instance that can be used to retrieve and * listen to values of the preferences. */ public static SharedPreferences getDefaultSharedPreferences(Context context) { return context.getSharedPreferences(getDefaultSharedPreferencesName(context), getDefaultSharedPreferencesMode()); } private static String getDefaultSharedPreferencesName(Context context) { return context.getPackageName() + "_preferences"; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.