La acción de notificación de Android no se activa (PendingIntent)

Estoy intentando agregar un elemento de acción de Notificación en mi aplicación que es un reproductor de música. Cuando se inicia un flujo, se debe activar una notificación y se debe mostrar un botón de detención para el flujo en la anotación. La notificación funciona bien hasta ahora, estoy teniendo problemas con el elemento de acción stop. Aquí es cómo se declara en el servicio que inicia el flujo:

Intent stopIntent = new Intent(this, MusicPlayerNew.class); stopIntent.putExtra("STOP", "STOP"); PendingIntent stopPendingIntent = PendingIntent.getActivity(this, 0, stopIntent, PendingIntent.FLAG_UPDATE_CURRENT, null); mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent); 

Ahora en el onResume () – método de mi actividad comprobar con getIntent (). GetStringExtra () para el "STOP" extra, pero la intención que recuperé a través de getIntent () no tiene extras set 🙁

También intenté comprobar para enviar una difusión (tengo un receptor de la difusión que trabaja para comunicarme del servicio a la actividad)

 Intent stopIntent2 = new Intent(MusicPlayerNew.STOP_MEDIAPLAYER); PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, stopIntent2, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent2); 

Ahora esto funciona si la actividad está actualmente en primer plano. Si la actividad está en el fondo el botón de parada no hace nada 🙁

EDIT: Tengo el BroadcastReceiver en mi actividad como una clase privada

 private class DataUpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { .. }} 

En el onResume () registra mi aplicación para este receptor:

 intentFilter = new IntentFilter(STOP_MEDIAPLAYER); registerReceiver(dataUpdateReceiver, intentFilter); 

OnPause ()

 unregisterReceiver(dataUpdateReceiver); 

Ahora, si elimino el registro del método onPause (), la difusión se recibe incluso si la aplicación / actividad ya no está en primer plano. ¿Pero es esta la manera correcta de hacerlo? Tengo este registro / unregister-cosas de un tutorial en la web creo ..

Encontré solución en este hilo en el código de Google https://code.google.com/p/android/issues/detail?id=61850

Para corregirlo debe agregar el indicador PendingIntent.FLAG_CANCEL_CURRENT a su PendingIntent .

 PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, stopIntent2, PendingIntent.FLAG_CANCEL_CURRENT); 

Me encontré con este problema hoy. En mi caso estaba utilizando intentos de intento en caché de una instancia anterior de la intención como todos los parámetros para los constructores de pendingIntent era lo mismo. Encontré dos soluciones para esto …

  1. Utilizando FLAG_CANCEL_CURRENT como menciona Nik .
  2. Pasar un pendingIntent único al pendingIntent como sigue

     PendingIntent pi = PendingIntent.getService(this, UNIQUE_ID, pi, 0); 

En mi caso, el segundo método resolvió el problema ya que necesito mantener vivas las notificaciones anteriores. Puede que esto ayude a alguien con problemas similares.

Me encontré con este problema hoy en día y fue causado por la actividad que no se registró o agregó a AndroidManifest.xml . Pensé que lo tenía allí, pero no lo era. Además, no se estaban registrando errores al intentar invocar la acción con su intención.

Me imaginé esto creando una intención y luego llamando a startAcitivty (intención) sin usar una notificación. Entonces me dio un error diciendo que la actividad era probable que faltaba en el manifiesto.

Si ninguna de las otras respuestas resuelven su problema, espero que esto sea así. Normalmente los problemas difíciles son el resultado de algo simple y tonto.

Esta es una respuesta muy tarde, pero puede ayudar a alguien:

Debe elegir el tipo correcto de intención pendiente en función de la intención que desea ejecutar. Aquí hay unos ejemplos:

Para el uso de la actividad a continuación:

 Intent i = new Intent(this, YourActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); 

Para el uso del servicio a continuación:

 Intent i = new Intent(this, YourService.class); PendingIntent pi = PendingIntent.getService(this, 0, i, 0); 

Para uso del Broadcast Receiver a continuación:

 Intent i = new Intent(this, YourReciver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); 

Puede que tenga que cambiar el código de solicitud y Banderas si es necesario

Más que utilizar receptor de difusión, debe utilizar un servicio y declarar una nueva acción en su servicio de esta manera:

 public final String ACTION_STOP = "yourpackagename.ACTION_STOP"; 

Y luego crea tus intentos como este:

 Intent stopIntent = new Intent(this, YourService.class).setAction(YourService.ACTION_STOP); PendingIntent stopPendingIntent = PendingIntent.getService(this, 0, stopIntent, 0); 

Por supuesto, detenga la reproducción en la función startCommand su servicio, si la acción de la intención es igual a ACTION_STOP .

Esto debería funcionar 😉

No recibe la transmisión cuando está en segundo plano porque está cancelando el registro en onPause. Mueva el código unregisterReceiver a la función onDestroy. Esto será llamado sólo cuando la actividad sea destruida. O puede cancelar el registro una vez que se ha producido el evento esperado.

Hay varias preguntas aquí:

Parte 1: ¿Por qué su intención no recibe el "STOP" extra? Aunque no se ve en el código que ha proporcionado, quería confirmar si está utilizando el indicador FLAG_ACTIVITY_SINGLE_TOP para la intención de notificación. Si es así, la intención que recibirá en su actividad sería la intención que inició la actividad y por lo tanto, la "STOP" extra no estará disponible. Tendrá que extender el onNewIntent() es este caso (donde se envía la nueva intención). Más información aquí .
Si no ha utilizado FLAG_ACTIVITY_SINGLE_TOP, significa que se crea una nueva actividad cuando se activa la notificación, en cuyo caso el Intent debe tener el parámetro "STOP". Si usted puede proporcionarme todo el código relevante, puedo ayudarle mejor.

Parte 2: Uso del receptor de difusión Esto no es sencillo, como ya lo descubrió. Debería anular el registro en onDestroy y si su actividad es cerrada por el usuario, se puede llamar a onDestroy y su receptor de difusión puede no estar activo en el momento en que la notificación es aprovechada por el usuario. Si no se cancela el registro en absoluto, puede parecer que funciona, pero se trata de una pérdida de memoria, GC puede limpiar en cualquier momento que podría dar lugar a un accidente en su programa, es decir, debe cancelar el registro. Si usted necesita ir con enfoque de receptor de difusión, necesita tener un servicio para hacer esto y el servicio viene con sus propias trampas -> reiniciar por el sistema, la batería de drenaje, etc Te recomiendo encarecidamente que vaya con su primer enfoque.

Tenía un problema muy similar, pero una solución muy diferente. La intención pendiente tampoco se <service android:enabled="false"></service> si has declarado <service android:enabled="false"></service> en tu archivo manifest.xml.

Reemplazar desde android:enabled="false" a android:enabled="true"

Esto podría no ser un problema directo del problema. Pero si crea el servicio en android studio usando plantilla predeterminada, agrega automáticamente estas propiedades al servicio.

Para mí, la solución fue establecer las banderas de la intención:

 resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
  • ¿Por qué mi administrador de alarmas de Android está disparando al instante?
  • Android: Apertura de actividad incorrecta del widget
  • Android: la adición de datos al intento falla al cargar la actividad
  • Cómo recibir notificaciones cuando se notifica una notificación
  • ¿Cómo utilizar PendingIntent para comunicarse desde un servicio a un cliente / actividad?
  • Android O, Background Service se está ejecutando durante más de 30 minutos. ¿Por qué?
  • RecognizerIntent: cómo agregar un paquete a una intención pendiente
  • Creación de una notificación en un momento determinado mediante el Administrador de alarmas
  • Android: Inicie el servicio con Context.startService vs PendingIntent.getService
  • ¿Por qué mi actividad siempre muestra el mismo conjunto de datos de una notificación de GCM?
  • ¿Cómo enviar una emisión ordenada en un PendingIntent?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.