2012-03-22 15 views
5

Tengo la actividad ejecutándose en modo SingleTop y receptor C2DM. En alguna notificación necesito para ejecutar esa actividad y que lo hace de esa manera:Manejo onNewIntent para FLAG_ACTIVITY_NEW_TASK

Intent activity = new Intent(context, klass); 
activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
context.startActivity(activity); 

Cuando la actividad si el fondo (botón de inicio, por ejemplo, presionado antes), todo funciona bien. Pero cuando acabo de presionar el botón de Encendido para apagar la pantalla, no se puede notificar a la actividad de ejecución sobre algunos cambios (onNewIntent nunca se llamó).

¿Cómo puedo notificar la actividad en ejecución sobre la notificación?

+0

Aconsejo que no actualice su UI en onCreate solamente pero también use onResume. Sin embargo, creo que la pregunta es demasiado confusa y no estoy seguro de que tengamos todo lo que necesitamos para responder. Proporcione algún código de actividad, los métodos principales. – Snicolas

+0

El teléfono está bloqueado, y la actividad parece estar en primer plano y no se reinicia, 'onResume',' onCreate' y 'onNewIntent' no se llama – skayred

+0

Puede considerar usar un servicio, tal vez con un poco de bloqueo de red para asegurarse de recibir c2dm notificaciones – Snicolas

Respuesta

4

Skayred, Creo que tuve exactamente la misma situación. Sin embargo, noté que cuando el teléfono estaba dormido y se enviaba un nuevo intento a la actividad, no comenzaba la actividad hasta que la pantalla estaba encendida (para mis propósitos quería que la pantalla estuviera encendida).

Mi solución fue adquirir un wakelock en mi receptor C2DM.

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,  TAG); 
mWakeLock.acquire(); 

Por supuesto, asegúrese de liberar el bloqueo con mWakeLock.release() en su actividad.

Esto es un comportamiento extraño y no parece ser consistente con el comportamiento de otras actividades de Android. En mi caso, estoy usando una actividad única de Tareas (no estoy seguro de qué tipo de actividad estás usando, no dijiste). Si no hay una instancia de la actividad en la parte superior de la pila, y el teléfono está dormido mi actividad se iniciará y lo puede utilizar lo siguiente en el onCreate():

getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

Sin embargo, si la actividad está en la parte superior de la pila y el teléfono está dormido, la actividad no se inicia hasta que enciendo la pantalla. Espero que esto funcione para ti. Si no necesitas que la pantalla se encienda, intentaré jugar con las otras banderas para el wakelock.

1

acuerdo con que la configuración, esto debería funcionar:

  • construir una clase de aplicación como un conjunto unitario, más tarde se puede acceder a él fácilmente
  • darle un miembro de datos que es un modelo de datos, será accesible tanto desde el receptor de notificación C2DM y todas las actividades infantiles
  • construir su modelo de datos de acuerdo con observable-Observador patrón de diseño
  • la notificación C2DM va a cambiar el modelo
  • actividades, en onCreate podrá conectar un detector de eventos, desconecte durante OnDestroy
  • cuando el modelo cambia se dispara un evento para todos los oyentes, y actividades, al recibir el evento, actualizar su interfaz de usuario

Ésta es una buena oportunidad para obtener un mejor diseño en tu aplicación también.