2010-06-28 6 views

Respuesta

10

No sé si hay un método para obtener la actividad que se muestra actualmente, pero podría hacer algo combinando el Activity Lifecycle y una bandera.

Para la bandera, si ha extendido la clase de Aplicación, probablemente sea un lugar decente para almacenarla. Para ampliar la clase de aplicación, el top answer to this question tiene información. (re).

Por lo tanto, probablemente realice un seguimiento de la actividad activa actual (o un indicador de que la actividad está visible) en onResume/onPause o onStart/onStop, dependiendo de qué comportamiento desea exactamente.

Dado que tiene múltiples actividades, necesitará un lugar centroide para almacenar la bandera, por lo que la aplicación tiene sentido. Puede obtener el objeto Aplicación personalizado al convertir el contexto de la aplicación (por ejemplo, ((MiAplicación) getApplicationContext()). IsMyActivityActive).

Puede ampliar la Actividad también para ayudar a mantener este código limpio y contenido.


Si está utilizando un servicio que podría enlazar con el servicio en todas las actividades en el onStart/onStop (o onResume/onPause). Si está vinculado, eres visible.

+1

No es cierto en todos los casos. Por ejemplo, cuando adquiere un bloqueo por activación PROXIMITY_SCREEN_OFF_WAKE_LOCK, para imitar el comportamiento de un modo de llamada, cuando la pantalla se apaga o enciende cuando el usuario se acerca al oído, es un comportamiento deseado cuando escribe, por ejemplo, una aplicación de voip. Pero a medida que el usuario coloca el teléfono cerca de su cabeza y bloquea la pantalla, se llama a OnPause y, al contrario, en Reencender. El problema es que no sabes por qué se llama, por lo que no sabes si debes pausar tu aplicación o no. Por lo tanto, es posible que existan otros eventos que puedan causar llamadas a onPause o onResume. –

3

onResume() llamado & & onPause() no llamado = visible.
Tiene un public static Activity currentlyVisible; en su subclase Application que se actualizará según sus actividades (establecido en la instancia en onResume() y null ed en onPause()). O invente una variante menos fea de un registro.

+5

No debe contener referencias al objeto de actividad como ese ... ver http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html. – cristis

+0

Hablando en general, sí. A menos que anule las referencias manualmente antes de que sea demasiado tarde. – yanchenko

+0

Porque Activity.isResumed o Activity.isStarted hubiera sido demasiado fácil ... :-) – GenesisST

2

Puede usar onWindowFocusChanged (boolean hasFocus) colóquelo en una superclase de sus actividades para iniciar la intención si tiene foco.

+0

Esto es agradable, pero necesitaría diálogos personalizados, ya que un diálogo provocará que onWindowFocusChanged (bool) le diga que la actividad no es visible, según la documentación. Por lo tanto, no parece una buena solución en este caso. Le importa que la aplicación esté en primer plano más que ser visible. – Justin

4

Puede solicitar las tareas en ejecución de ActivityManager:

ActivityManager activityManager = (ActivityManager)getContext() 
       .getSystemService(Context.ACTIVITY_SERVICE); 
List<RunningTaskInfo> runningTasks = activityManager.getRunningTasks(Integer.MAX_VALUE)); 

De documentos de la API:

devolver una lista de las tareas que se están ejecutando actualmente, con los más reciente de los cuales el primero y los más viejos después en orden.

Así que el primer elemento de la lista es la actividad más avanzada.

+14

También desde los documentos API: Nota: este método solo está destinado a la depuración y presenta interfaces de usuario de administración de tareas. Esto nunca debe usarse para la lógica central en una aplicación, como decidir entre diferentes comportamientos según la información que se encuentra aquí. Tales usos no son compatibles, y es probable que se rompan en el futuro. Por ejemplo, si se pueden ejecutar varias aplicaciones al mismo tiempo, las suposiciones sobre el significado de los datos aquí a los fines del flujo de control serán incorrectas. –

0

En lugar de usar el Administrador de actividades, hay un truco simple que puede hacer a través del código. Si observa el ciclo de actividad de cerca, el flujo entre dos actividades y el primer plano al fondo es el siguiente. Supongamos que A y B son dos actividades.

Cuando transición de A a B: 1. onPause() de A se llama 2. onResume() de B se llama 3. onStop() de A se llama cuando B se reanuda totalmente

Cuando aplicación va en el fondo: 1.onPause() de A se llama 2. onStop() de A se llama:

Puede detectar su evento de fondo simplemente poniendo un indicador en actividad.

Realice una actividad abstracta y extiéndala de sus otras actividades, de modo que no tenga que copiar pegue el código para todas las demás actividades donde lo necesite.

En actividad abstracta, cree la marca isAppInBackground.

En el método onCreate(): isAppInBackground = false;

En método onPause(): isAppInBackground = false;

En el método onStop(): isAppInBackground = true;

Solo necesita comprobar su onResume() si isAppInBackground es verdadero. n después de comprobar su bandera a continuación, establezca de nuevo isAppInBackground = false

para la transición entre dos actividades desde OnStop() de la primera será siempre llamada después de la segunda actvity reanuda, bandera nunca será verdadera y cuando la aplicación está en segundo plano, onStop () de la actividad se llamará inmediatamente después de OnPause y, por lo tanto, la bandera será verdadera cuando abra la aplicación más adelante.

Cuestiones relacionadas