Android GCM: forma diferente de gestionar el envío dependiendo de si la aplicación es visible o no
Tengo un par de actividades y un servicio intencional que maneja los mensajes entrantes de GCM.
Ahora mismo para cada empuje, estoy enviando una notificación, y después de que el usuario haga clic en él, es redirigido a la pantalla apropiada.
- Cómo romper el contenido de las notificaciones en Android
- Cómo comprobar si la aplicación está en primer plano o en segundo plano
- Solicitud del ID de registro de Google Cloud Messaging (GCM) cada vez que se inicia la aplicación
- Mensajería en la nube de Google, incapaz de inicializar el receptor
- ¿Cómo lograr un servicio confiable de mensajes push?
Me gustaría cambiar este comportamiento que si la aplicación es visible (cualquier actividad está en primer plano), en lugar de la notificación se muestra un mensaje de diálogo (con la acción adecuada).
¿Alguna idea de cómo implementarlo?
Tengo 2 ideas pero ninguna de ellas es perfecta:
- Mantener un registro de cada actividad en la aplicación, si la actividad es visible, no mostrar la notificación, pero envió una intención a la actividad (no agradable solución)
- Registrar / cancelar el registro del segundo receptor de difusión en onResume / onPause de cada actividad, "atrapar" la transmisión entrante de GCM (no estoy seguro de si es posible).
¿Alguna otra solución?
- Notificación de empuje que no recibe android
- Instalar jar con dependencias para el repositorio maven (Android gcm-server push library)
- Notificación push de C2DM sin MQTT, UA en android api level <8
- FCM (Firebase Cloud Messaging) cómo enviar a todos los teléfonos?
- Notificación de emisión del receptor de difusión
- ¿Cuál es el uso principal de mensajería ascendente en GCM Cloud Connection Server?
- Android GCM PushNotification - Añadir añadir archivo de sonido personalizado en la aplicación
- Cómo evitar el retraso en los mensajes de GCM de Android / cambio de latidos del corazón
No lo probé, pero los documentos dicen que puedes obtener el número de actividades en ejecución por cada tarea.
Intente encontrar la tarea de su aplicación entre las tareas actualmente en ejecución:
ActivityManager acitivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); // Get the top of running tasks, limit by 100 List<RunningTaskInfo> tasks = acitivityManager.getRunningTasks(100); for (RunningTaskInfo taskInfo : tasks) { if (YOUR_PACKAGE_NAME.equals(taskInfo.baseActivity.getPackageName())) { if (taskInfo.numRunning > 0) { // Show dialog } else { // Show notification } break; } }
Google ha añadido una nota a getRunningTasks()
:
Nota: este método sólo está diseñado para depurar y presentar interfaces de usuario de administración de tareas. Esto nunca debe utilizarse para la lógica de núcleo en una aplicación, como decidir entre diferentes comportamientos basados en la información que se encuentra aquí. Tales usos no están soportados, y probablemente se romperán en el futuro. Por ejemplo, si varias aplicaciones pueden ejecutarse activamente al mismo tiempo, las suposiciones hechas sobre el significado de los datos aquí para propósitos de flujo de control serán incorrectas.
Así que úselo bajo su propio riesgo.
También compruebe si se ordenan las emisiones de GCM. Si es así, puede "anular" su BroadcastReceiver
predeterminado con los otros en cada actividad. Simplemente juegue con la prioridad de IntentFilter
s. Cuando el BroadcastReceiver
con mayor prioridad recibe el mensaje, puede abortar su propagación adicional. Para su aplicación esto significa que cuando se está ejecutando alguna Activity
, registra el receptor que muestra el diálogo y aborta la emisión. Si no hay actividad activa, el receptor predeterminado muestra la notificación.
Una posible solución (idea 1):
Para detectar si su aplicación está ejecutando back-or foreground, simplemente puede configurar un booleano en onPause / onResume:
@Override protected void onResume() { super.onResume(); runningOnBackground = false; } @Override protected void onPause() { super.onPause(); runningOnBackground = true; }
Cuando inicia una nueva intención desde una notificación, este método se llama: (si está utilizando singleTop), con el booleano puede determinar qué hacer en el método onNewIntent.
@Override protected void onNewIntent (Intent intent){ if(runningOnBackground){ //do this } else{ //do that } }
¡Espero eso ayude!
- Adición de vistas en un orden específico y almacenamiento de dicho pedido
- MPAndroidChart LineChart personalizado resaltar dibujable