tutorial studio manager example android android-intent bundle alarm

android - studio - getExtra from Intent lanzado desde un pendienteInternet



bundle android studio example (5)

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, quizás debido a la pendiente pendiente o la transmisión del receptor, algo debe hacerse de manera diferente. Gracias

La función que envía el Intento a través del intento pendiente

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); } }


Debería usar el método intent.putExtra() . No configurar el paquete al segmento de extras. SI establece una cadena, intent.putExtra(<key>, value); Intenta esto, se hará. Lo usé.


Las intenciones se reutilizan en el sistema, a menos que difieran en el contexto / acción, creo. Enlace de documentación . Es decir, si ya ha construido un Intento, ese intento podría ser utilizado más tarde también.

Como 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 relevante :

Debido a este comportamiento, es importante saber cuándo dos Intents se consideran iguales para los fines de recuperar 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.


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

Un simple ejemplo sería

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

Esta es la forma correcta y garantizará que se entreguen sus nuevos valores.

Espero eso ayude.


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());`

Espero que ayude a alguien, código feliz ...! :)


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