14

Estoy intentando enviar a través de PendingIntent algunos datos adicionales, como:¿Cómo enviar datos a través de PendingIntent a Broadcast?

MyMessage message; 
//... 
Intent intent; 
SmsManager sms = SmsManager.getDefault(); 
intent = new Intent(Constants.SENT_PLAIN); 
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId()); //putting long id (not -1L) 
PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent, 0); 
intent = new Intent(Constants.DELIVERED_PLAIN); 
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId()); 
PendingIntent deliveredPI = PendingIntent.getBroadcast(activity, 0, intent, 0); 
sms.sendTextMessage(phoneNumber, null, message.getBody(), sentPI, deliveredPI); 

Luego, en Broadcast tratando de recuperar los datos:

@Override 
public void onReceive(Context context, Intent intent) { 
    String message, prefix = ""; 
    String action = intent.getAction(); 
    long id = intent.getLongExtra(Constants.EXTRA_RAW_ID, -1L); //here I receive id=-1 

    // blah-blah.... 
} 

veo que BroadcastonReceive() llama - lo que significa que Broadcast registrados de una manera adecuada, pero los extras están vacíos.

¿Alguna idea?

+0

He hecho algo similar AQUÍ !!! http://stackoverflow.com/questions/14571564/android-pendingintent-extras-not-received-by-broadcastreceiver/14612215#14612215 – toobsco42

Respuesta

34

Ponga los datos en la intención que está utilizando en intento pendiente como Extras. Obtendrá esta intención en onReceive Método del receptor BroadCast. Intente definir la intención pendiente de la siguiente manera.

PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT); 
+0

Lo comprobaré ... – barmaley

+0

Y sí, ¡funciona! ¡Muchas gracias! – barmaley

+1

Luego marque la respuesta como amigo aceptado o la pregunta permanecerá sin respuesta :) .. – om252345

10

como dijo el pending intent:

Debido a este comportamiento, es importante saber cuando dos Intentos se consideran ser los mismos para fines de recuperación de un PendingIntent. Un error común que cometen las personas es crear múltiples objetos PendingIntent con Intents que solo varían en sus contenidos "extra", esperando obtener un PendingIntent diferente cada vez. Esto hace no suceder. Las partes de la intención que se utilizan para la coincidencia son las mismas definidas por Intent.filterEquals. Si usa dos objetos de intención que son equivalentes según Intent.filterEquals, obtendrá el mismo PendingIntent para ambos.

Hay dos formas típicas de lidiar con esto.

Si realmente necesita objetos activos PendingIntent distinta múltiple en mismo tiempo (por ejemplo, para utilizar como dos notificaciones que se muestran ambos al mismo tiempo), entonces necesitará para asegurar que haya algo que es diferente sobre ellos para asociarlos con diferentes PendingIntents. Esto puede ser cualquiera de los atributos considerados por Intención Intent.filterEquals o diferentes enteros de código de solicitud suministrado a getActivity(Context, int, Intent, int), getActivities(Context, int, Intent\[\], int), getBroadcast(Context, int, Intent, int) o getService(Context, int, Intent, int).

Si sólo necesita una PendingIntent activo a la vez para cualquiera de los Intentos que va a utilizar, a continuación, puede, alternativamente, utilizar las banderas FLAG_CANCEL_CURRENT o FLAG_UPDATE_CURRENT de cancelar o modificar lo PendingIntent actual se asocia con la intención de que son que suministran.

Cuestiones relacionadas