Android no puede pasar extras intent a través de AlarmManager

Estoy tratando de poner un mensaje extra en mi bash de pasar a AlarmManager para que se active más adelante. My onReceive se activa correctamente pero extras.getString () devuelve null

Preparar:

public PendingIntent getPendingIntent(int uniqueRequestCode, String extra) { Intent intent = new Intent(this, ActionReceiver.class); intent.putExtra("EXTRA", extra); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0); return pendingIntent; } public void setSilentLater(TimeRule timeRule) { boolean[] weekdays = timeRule.getReoccurringWeekdays(); int dayOfWeek = 0; for (boolean day : weekdays) { dayOfWeek++; if (day == true) { Calendar cal = Calendar.getInstance(); AlarmManager alarmManager = (AlarmManager) this .getSystemService(Context.ALARM_SERVICE); cal.set(Calendar.DAY_OF_WEEK, dayOfWeek); cal.set(Calendar.HOUR_OF_DAY, timeRule.getStartTime().get(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, timeRule.getStartTime().get(Calendar.MINUTE)); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 3600000 * 7, getPendingIntent(0, "RINGER_OFF")); } } } 

Cuando esto se dispara, el mensaje está vacío:

 public class ActionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); String message = extras.getString("EXTRA"); //empty if(message == "RINGER_OFF") { AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); am.setRingerMode(AudioManager.RINGER_MODE_SILENT); } else if(message == "RINGER_ON") { AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); am.setRingerMode(AudioManager.RINGER_MODE_NORMAL); } } } 

ACTUALIZACIÓN: Consulte la solución de Vincent Hiribarren


Respuesta anterior … El código de Haresh no es la respuesta completa … Utilicé un paquete y lo intenté sin Bundle, pero obtuve un nulo de cualquier forma cuando intenté obtener las cadenas del extra.

El problema exacto, en su código, es con PendingIntent!

Esto es incorrecto si estás tratando de pasar extra:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);

Porque el 0 para las banderas es lo que te causará dolor de cabeza

Esta es la forma correcta de hacerlo: ¡especifique una bandera!

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Este es probablemente un problema tan popular porque el código de muestra de Google omitió incluir extra en una alarma.

Tengo algunas precisiones que podrían ayudar a otros a ser asociadas con la solución de Someone Somewhere. Si transfiere objetos Parcelable personalizados como extra, es posible que el sistema operativo no pueda procesarlos, por lo que se produce una excepción interna y se pierden los extras.

Con Android N, incluso con PendingIntent.FLAG_UPDATE_CURRENT) no puedo recuperar mis extras personalizados de Pacelable.

Así que tuve que usar el sistema conocido Parcelable (como ParcelUuid ) para hacer referencia a algunos objetos en una base de datos personalizada en lugar de proporcionar todo mi objeto Parcelable.

Otra solución es convertir Parcelable en una matriz de bytes que el sistema reconoce correctamente: Cómo gestionar y deshacer una matriz Parcelable a byte con la ayuda de Parcel?