2010-01-14 11 views
9

Tengo una aplicación, que establece una alarma usando AlarmManager, que inicia otra actividad cuando se apaga. El AlarmManager toma un PendingIntent y genera una clase BroadcastReceiver cuando llega la hora especificada. Me pregunto si hay alguna forma de que pueda pasar argumentos a este BroadcastReceiver a través del objeto Intent que va a PendingIntent.Transmisión de argumentos a un BroadcastReceiver a través de un Intento en Android

Básicamente lo que me gustaría hacer es algo como esto:

Intent my_intent = new Intent(this, BroadcastService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, my_intent, 0); 
my_intent.putExtra("arg1", arg1); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000), pendingIntent); 

y me gustaría ser capaz de recuperar arg1 en el método (Contexto, Intención) OnReceive del BroadcastReceiver. Pensé que la variable local my_intent sería el segundo parámetro transferido a onReceive por PendingIntent, pero aparentemente eso no es del todo correcto. ¿Es posible pasar parámetros entre una Actividad y un BroadcastReceiver de esta manera (usando Intent.putExtra()) o debería usar un ContentProvider en su lugar?

Gracias!

Iva

Respuesta

1

Tengo una aplicación, que establece una alarma usando AlarmManager, que comienza otra actividad cuando se apaga.

Eso es mala forma. No muestre actividades no anunciadas como esta sin un buen motivo (por ejemplo, una llamada entrante). ¿Qué sucede si el usuario está haciendo algo, como TXTing o jugando un juego o tratando de tocar los números para el menú de un teléfono?

¿Es posible pasar parámetros entre una actividad y una BroadcastReceiver de esta manera (usando Intent.putExtra())

Sí. Sin embargo, tenga en cuenta que querrá usar PendingIntent.FLAG_UPDATE_CURRENT cuando cree su PendingIntent, para asegurarse de que los nuevos extras que suministre en el Intent sean realmente utilizados.

+0

Ah sí, dije mal; Estoy usando la alarma como una avenida para invocar una actividad en particular en un momento determinado, y cuando suena la alarma, creo una notificación que luego el usuario puede desplegar siempre que sea conveniente y solo luego invocar la actividad, para que yo no use No molesten lo que sea que estén haciendo. ¡Gracias por tu respuesta! – ivcheto

+0

Hmm, agregar PendingIntent.FLAG_UPDATE_CURRENT como indicador al obtener PendingIntent no parece cambiar nada; Todavía no obtengo los extras del intento en mi Actividad original para la intención pasada a la recepción de 0Recibir – ivcheto

+1

¿Está llamando a putExtra() antes de crear el PendingIntent? No sé cuándo PendingIntent serializa el Intento, pero si lo hace de inmediato, poner llamadas a Extra() después de crear el PendingIntent no tendría ningún efecto. – CommonsWare

1

Sí, creo que es posible pasar cualquier dato de tipo Java básico y tipos serializables/Parceable en los extras de un intento envuelto alrededor de un PendingIntent y luego recuperarlos mediante la instancia de Intención pasado a la onRecepción del Broadcastreiver. Tu enfoque me parece bien.

¿Cuál es el problema/error que está obteniendo? ¿La instancia "arg1" se puede serializar?

+0

No obtengo un error; Simplemente no recibo un paquete con la intención de pasar a mi método Receptor (Contexto, Intención) de mi BroadcastReceiver; Supongo que la intención transmitida a mi BroadcastReceiver es la misma intención que creo (y llené) en mi actividad. En este caso, cualquier argumento que quiera pasar es de hecho Serializable. – ivcheto

+0

¿Puede mostrarnos su código que tiene/pone putExtra (..) y getXXXExtra (..)? – Samuh

+1

Resulta que solo necesitaba poner el putExtra (...) llamadas antes de crear el PendingIntent. ¡Gracias por tu ayuda! – ivcheto

9

Tuve un problema similar, pero ya estaba completando la intención antes de envolverla en un PendingIntent. Pero la respuesta a mi problema fue, como se señaló anteriormente, que necesitaba usar el indicador PendingIntent.FLAG_UPDATE_CURRENT. Una vez que configuré la bandera, ¡funcionó! Espero que esto ayude a otros. -Jeff

+0

Estaba teniendo este mismo problema y la bandera lo hizo totalmente. ¡Gracias! – DanO

+0

¡Eres un salvavidas! –

5
int code=1; 
Intent i2 = new Intent(StartAlarm); 
i2.putExtra("_id",code); 

class test extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
     int i=arg1.getIntExtra("_id",-1); 
    } 
} 
Cuestiones relacionadas