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.

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?

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!

  • Cadena Spannable con imagen que no funciona con la notificación push
  • Clave de aplicación de desarrollo y secreto de aplicación para Android
  • Cómo construir un servidor de notificación push de Android en PHP
  • ¿Cómo desarrollar notificaciones push para Android sin usar mensajería en la nube de google?
  • Inactividad, desconectarse de AppMeasurementService
  • ¿En qué plataformas móviles el "push token" no es permanente?
  • Las notificaciones de inserción de Parse.com no funcionan de forma consistente recibiendo el error "GCM -MISMATCH SENDER ID"
  • Android: Notificación de prueba en línea (Google Cloud Messaging)
  • ¿Existen alternativas a Google Cloud Messaging para las compilaciones personalizadas de Android?
  • El Dirigible Urbano se estrella al despegar. Argumento de excepción ilegal
  • GCM Error = MissingRegistration enviando mensajes vía JSON
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.