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 🙁
- Iniciar la aplicación sólo si no está en ejecución
- ¿Se pueden usar intentos pendientes con las transmisiones locales?
- Adición de indicadores a PendingIntent
- No se puede agregar ventana - token android.os.BinderProxy@42824 no es válido; ¿Está funcionando su actividad?
- Cómo probar con Espresso un PendingIntent generado por TaskStackBuilder
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 ..
- ¿Funcionará AlarmManager si mi aplicación no se está ejecutando?
- PendingIntent programado utilizando el tipo AlarmManager.RTC todavía se invoca en el modo de suspensión
- Android - ¿Qué es un PendingIntent?
- La notificación abre actividad, se pulsa el botón de retroceso, se abre la actividad principal?
- Ocultar la acción del teléfono abierta en el uso
- AlarmManager, BroadcastReceiver y el servicio no funciona
- ¿Cómo actualizar vista de un widget en el botón de clic en android?
- Intención con el extra antiguo en onCreate () para singleTask Actividad
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 …
- Utilizando FLAG_CANCEL_CURRENT como menciona Nik .
-
Pasar un
pendingIntent
único alpendingIntent
como siguePendingIntent 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);