segundo - notificaciones push android
La acción de notificación de Android no se activa(PendingIntent) (9)
Encuentro la solución en este hilo en el código de google https://code.google.com/p/android/issues/detail?id=61850
Para solucionarlo, debe agregar el indicador PendingIntent.FLAG_CANCEL_CURRENT
a su PendingIntent
.
PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0,
stopIntent2, PendingIntent.FLAG_CANCEL_CURRENT);
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 una transmisión, se debe activar una notificación y se debe mostrar un botón de parada en la notificación. La notificación funciona bien hasta ahora, tengo problemas con el elemento de acción de detención. Así es como se declara en el servicio iniciando 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 método onResume () - de mi actividad verifico con getIntent (). GetStringExtra () para el "STOP" extra, pero la intención que obtuve a través de getIntent () no tiene ningún conjunto de extras :(
También traté de verificar el envío de una emisión (tengo un receptor de difusión trabajando 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 segundo plano, el botón de parada no hace nada :(
EDITAR: 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 registro de onResume () mi aplicación para este receptor:
intentFilter = new IntentFilter(STOP_MEDIAPLAYER);
registerReceiver(dataUpdateReceiver, intentFilter);
en pausa ()
unregisterReceiver(dataUpdateReceiver);
Ahora, si elimino el desregistro del método onPause (), se recibe la transmisión, incluso si la aplicación / actividad ya no está en primer plano. ¿Pero es esta la manera correcta de hacerlo? Conseguí este registro / anular el registro de cosas de un tutorial en la web, creo ...
Esta es una respuesta muy tardía, pero puede ayudar a alguien:
Debería 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 uso del Servicio a continuación:
Intent i = new Intent(this, YourService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
Para uso de Broadcast Receiver a continuación:
Intent i = new Intent(this, YourReciver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
Es posible que deba cambiar el código de solicitud y los indicadores si es necesario
Hay varias preguntas aquí:
Parte 1: ¿Por qué su intención no recibe el "STOP" adicional? 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 la notificación. Si es así, la intención que reciba en su actividad sería la intención que inició la actividad y, por lo tanto, no estará disponible el "STOP" adicional. Tendrá que extender el onNewIntent()
este caso (donde se envía la nueva intención). Más información aquí .
Si no ha usado FLAG_ACTIVITY_SINGLE_TOP, significa que se crea una nueva actividad cuando se toca la notificación, en cuyo caso la intención debe tener el parámetro "DETENER". Si puedes proporcionarme todo el código relevante, puedo ayudarte mejor.
Parte 2: uso de Broadcast Receiver Esto no es sencillo, como ya descubrió. Deberá anular el registro en onDestroy y si el usuario cierra su actividad, es posible que se llame a onDestroy y que su receptor de difusión no esté activo en el momento en que el usuario toque la notificación. Si no se cancela el registro en absoluto, puede parecer que funciona, pero esto es una pérdida de memoria, el GC se puede limpiar en cualquier momento, lo que podría provocar un bloqueo en su programa, es decir, DEBE cancelar el registro. Si necesita optar por el enfoque de receptor de radiodifusión, debe tener un servicio para hacer esto y el servicio viene con sus propios inconvenientes -> reiniciar por sistema, agotar la batería, etc. Le recomendaría encarecidamente que vaya con su primer enfoque.
Más que usar el receptor de difusión, debe usar 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 intenciones de esta manera:
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 del intento es igual a ACTION_STOP
.
Esto debería funcionar ;)
Me encontré con este problema hoy y fue causado por la actividad no registrada o agregada a AndroidManifest.xml . Pensé que lo tenía allí, pero no lo era. Además, no se registraron errores al intentar invocar la acción con su intención.
Descubrí esto creando una intención y luego llamando a startAcitivty (intención) sin usar una notificación. Luego me dio un error que indica que la actividad probablemente faltaba en el manifiesto.
Si ninguna de las otras respuestas resuelve tu problema, espero que esto lo haga. Por lo general, los problemas difíciles son el resultado de algo simple y tonto.
Me encontré con este problema hoy. En mi caso, estaba usando los extras de la intención en caché de una instancia anterior de la intención, ya que todos los parámetros para los constructores de pendingIntent
eran los mismos. Encontré dos soluciones para esto ...
- Usando FLAG_CANCEL_CURRENT como lo menciona Nik .
Pasando un
pendingIntent
único a lapendingIntent
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 ser que esto ayude a alguien con un problema similar.
No recibe la transmisión cuando está en segundo plano porque no está registrando en onPause. Mueva el código unregisterReceiver a la función onDestroy. Esto será llamado solo cuando la actividad sea destruida. O puede cancelar el registro una vez que haya ocurrido el evento esperado.
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);
Tuve un problema muy similar pero una solución muy diferente. La intención pendiente tampoco se <service android:enabled="false"></service>
si ha declarado <service android:enabled="false"></service>
en su 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 utilizando la plantilla predeterminada, automáticamente agrega estas propiedades al servicio.