2010-05-21 10 views
36

Estoy intentando hacer algunas alarmas después de que el usuario seleccione algo con un tiempo de una lista y cree una notificación para él en el momento dado. Mi problema es que el "nombre del show" que putExtra en mi intención no se puede recibir en el receptor de difusión. Siempre obtiene un valor nulo. Esta es la forma en que lo hago para la mayoría de mis intentos, pero creo que esta vez, tal vez debido a la pendiente pendiente o la transmisión del receptor, algo debe hacerse de manera diferente. GraciasgetExtra from Intent lanzado desde un pendienteIntent

La función que envía la Intención a través de la intención pendientes

public void setAlarm(String showname,String time) { 

    String[] hourminute=time.split(":"); 
    String hour = hourminute[0]; 
    String minute = hourminute[1]; 
    Calendar rightNow = Calendar.getInstance(); 
    rightNow.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour)); 
    rightNow.set(Calendar.MINUTE, Integer.parseInt(minute)); 
    rightNow.set(Calendar.SECOND, 0); 
    long t=rightNow.getTimeInMillis(); 
    long t1=System.currentTimeMillis(); 

    try { 

    Intent intent = new Intent(this, alarmreceiver.class); 
    Bundle c = new Bundle();    
    c.putString("showname", showname);//This is the value I want to pass 
    intent.putExtras(c); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12345, intent, 0); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),pendingIntent); 
    //Log.e("ALARM", "time of millis: "+System.currentTimeMillis()); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

    } catch (Exception e) { 
     Log.e("ALARM", "ERROR IN CODE:"+e.toString()); 
    } 
} 

Y este es el extremo receptor

public class alarmreceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();  
    Bundle b = intent.getExtras(); 
    String showname=b.getString("showname");//This is where I suppose to receive it but its null 
    NotificationManager manger = (NotificationManager) context 
      .getSystemService(context.NOTIFICATION_SERVICE); 

    Notification notification = new Notification(R.drawable.icon, 
      "TVGuide Υπενθύμιση", System.currentTimeMillis()); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
      new Intent(context, tvguide.class), 0); 

    notification.setLatestEventInfo(context, "Το Πρόγραμμα Ξεκίνησε", 
      showname, contentIntent); 

    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE; 

    notification.sound = Uri.parse("file:///sdcard/dominating.mp3"); 
    notification.vibrate = new long[]{100, 250, 100, 500}; 
    manger.notify(1, notification); 
}   
} 

Respuesta

23

Intentos se vuelven a utilizar en el sistema, a menos que difieran en el contexto/acción, creo. Documentation Link. Es decir, si ya ha construido un Intento, ese intento podría ser utilizado más tarde también.

Como una prueba de depuración, puede intentar agregar intent.setAction("" + Math.random()) debajo de intent.putExtras(c) y ver si sus extras se reciben en el otro extremo.

documentación pertinente:

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 no sucede. 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.

+2

Esta es la respuesta correcta ......... – Necronet

+1

+1, esta es la respuesta correcta, debe ser aceptada.Es realmente útil, Thx. (Por cierto, también puede usar un código de solicitud diferente cuando crea intenciones pendientes, con un hash, eso es bastante conveniente). – Snicolas

50

Si cambia el valor de Extra en el intento, al crear el intento pendiente, debe usar el indicador PendingIntent.FLAG_CANCEL_CURRENT.

Un ejemplo sencillo sería

PendingIntent pi = PendingIntent.getBroadcast(context, 0,intentWithNewExtras,PendingIntent.FLAG_CANCEL_CURRENT); 

Ésta es la manera correcta y se asegurará de que los nuevos valores se entregan.

Espero que ayude.

+0

Esto no parece funcionar en el widget con flipper aparentemente una vez que se lanza una intención, el sistema intenta reutilizarlo y no se cambia nada adicional. – Necronet

+3

¡Trabajado para mí, estuve estancado durante horas! – Ali

+3

Resolvió el problema de 2 horas ... –

9

use un código de solicitud diferente para diferentes notificaciones de alarma para evitar sobrescribir la misma hora de alarma.

+0

¡Esta es la mejor respuesta para este tipo de preguntas! Solución muy simple y hermosa para un problema. –

+0

Estoy de acuerdo, una solución maravillosamente simple. – jp36

0

Debe utilizar el método intent.putExtra(). No configurar el paquete al segmento de extras. SI configura cadena, usted debería intent.putExtra(<key>, value); Intente esto, se hará. Lo usé.

0

Tuve el mismo problema. Lo resolví con la configuración de una acción para intentarlo, tal como lo sugiere @aioobe aquí, y mi intención funciona como una magia.

Aquí lo que hice

` intent.putExtra("Name", mName); 
    intent.putExtra("dateTime", newdate); 
    intent.setAction("" + Math.random());` 

esperan que ayude a alguien, la codificación feliz ..! :)

Cuestiones relacionadas