2010-11-08 7 views
8

Me encuentro con un problema peculiar con una aplicación que tiene múltiples actividades. Tengo una clase de administrador de pantalla que está vinculada a un servicio. El servicio sondea un servidor para obtener datos. El administrador de pantalla inicia la Actividad A, B o C, en función de los datos. También le permitirá al usuario seleccionar mostrar las otras actividades o puede cambiar una actividad automáticamente en función de los datos nuevos del servicio. Actualmente, toda la navegación funciona de maravilla y si el usuario presiona Inicio, la Actividad aplicable vuelve al primer plano cuando el usuario presiona el icono de la aplicación desde la pantalla de inicio de Android o la lista de aplicaciones ejecutadas recientemente.Android, qué indicadores de intención se recomiendan para Actividades iniciadas por Notificaciones

Luego tuve que implementar una nueva función para mostrar un icono y una notificación. Primero lo implementé mostrando solo la notificación cuando las Actividades ya no eran visibles configurándolas en cada Actividades en Pausa. Funcionó como un amuleto y le dio al usuario una tercera opción para volver a mostrar la aplicación después de presionar el botón Inicio. Sin embargo, si los datos del servidor (cuando la aplicación no se muestra) ocasionan que el administrador de pantalla actualice la actividad que se mostrará, tengo problemas. Creo que mi pila de actividades se está arruinando. Desde entonces he probado un modelo un poco diferente donde el Administrador de pantalla maneja las notificaciones y siempre muestra la notificación, actualizándola con un nuevo Intento cada vez que se actualiza una Actividad, pero aún no lo está cortando.

Cuando la aplicación se minimiza y los datos cambian puedo ver que el administrador de pantalla llama a startActivityForResult en la nueva actividad y parece que Android sabe que estamos minimizados y no muestra la actividad. También puedo llamar al Administrador de la pantalla para finalizar la Actividad superior anterior.

Cada actividad actualmente tiene el indicador establecido en singleTop en el manifiesto y FLAG_ACTIVITY_SINGLE_TOP en el código. Cuando los datos no han cambiado en el servidor, realizo la copia de seguridad de la aplicación usando cualquiera de los anteriores. Obtengo lo que esperaba y se llama a la Actividad onNewIntent. Sin embargo, cuando los datos han cambiado y el usuario llama la aplicación a través de la notificación, llama a las actividades en Crear. La actividad aparece y se ejecuta, pero presionar nuevamente me lleva a lo que parece ser otra instancia de la misma actividad en lugar de salir. Acabo de echar un vistazo más de cerca a mi logcat y veo 2 llamadas a la Actividad onResume, pero luego no dobla después de eso.

Siento que tal vez me está perdiendo algo simple como otra bandera de intención en la intención de la notificación? Gracias por cualquier idea!

Respuesta

5

Lo que me está matando son los datos del servidor que cambian cuando no se muestran.

No tengo idea de lo que esto significa.

Siento que tal vez me está perdiendo algo tan simple como otra bandera de intención en la intención de la notificación?

Solía ​​Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP que lidiar con el "me lleva de nuevo a lo que parece ser otra instancia de la misma actividad" problema, pero en mi caso, he tenido una aplicación de una sola actividad.

La documentación para FLAG_ACTIVITY_CLEAR_TOP también dice:

"Este modo de lanzamiento también se puede utilizar con buenos resultados en combinación con FLAG_ACTIVITY_NEW_TASK: si se utiliza para iniciar la actividad de las raíces de una tarea, que traerá cualquier instancia actualmente en ejecución de esa tarea hasta el primer plano, y luego borrarla a su estado raíz. Esto es especialmente útil, por ejemplo, al iniciar una actividad desde el administrador de notificaciones."

Hay también FLAG_ACTIVITY_REORDER_TO_FRONT:

" Por ejemplo, considere una tarea que consiste en cuatro actividades: A, B, C, D. Si D llama startActivity() con la intención de que se resuelve en el componente de la actividad B, entonces B se colocará al frente de la pila de historial, con este orden resultante: A, C, D, B. Este indicador se ignorará si también se especifica FLAG_ACTIVITY_CLEAR_TOP. "

Quizás uno de esos patrones se ajuste su necesidad.

+0

"Lo que me está matando son los datos del servidor que cambian cuando no se muestran." Lo siento, no debería haber usado la jerga. como tratando de decir es que estaba funcionando bien, excepto 0 cuando se le dice al gerente de pantalla que cambie la Actividad mostrada, y eso me pareció muy frustrante. Gracias por su consejo, volveré a intentar usar esa bandera adicional. – bursk

+0

gracias por la idea, pero establecer esa bandera no parece cambiar el comportamiento. – bursk

+0

Creo que descubrí por qué su sugerencia no parecía estar funcionando. Creo que otro hilo de fondo estaba impidiendo que la primera llamada iniciara la actividad para que se ejecute, por lo que cuando la intención de la notificación se dispara, no se ve la actividad en la parte superior de la pila. Entonces, la actividad se crea y se muestra. Luego, cuando lo descarto con el botón Atrás, se elimina de la pila. – bursk

Cuestiones relacionadas