¿Hay alguna forma simple de determinar si una determinada actividad está activa o no? Quiero hacer ciertas cosas dependiendo de qué actividad esté activa. p.ej:
if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
android
android-activity
usuario560571
fuente
fuente
Respuestas:
Puedes usar una
static
variable dentro de la actividad.El único inconveniente es que si lo usa en dos actividades que se vinculan entre sí,
onStop
la primera a veces se llama despuésonStart
en la segunda. Entonces, ambas podrían ser ciertas brevemente.Dependiendo de lo que intente hacer (¿actualizar la actividad actual de un servicio?). Simplemente puede registrar un escucha estático en el servicio en su
onStart
método de actividad y luego el escucha correcto estará disponible cuando su servicio quiera actualizar la IU.fuente
MyActivity
conMyChildactivity
y desea comprobar si el niño está activo?Me doy cuenta de que este problema es bastante antiguo, pero creo que aún vale la pena compartir mi solución, ya que podría ser útil para otros.
Esta solución no estaba disponible antes de que se lanzaran los Componentes de Arquitectura de Android.
La actividad es al menos parcialmente visible
La actividad está en primer plano
fuente
Creo que más claro así:
fuente
Una opción sin usar ninguna variable auxiliar es:
donde la actividad es fe: this o getActivity ().
El valor devuelto por esta expresión cambia en onStart () / onStop (), que son los eventos que comienzan / detienen mostrando el diseño de la actividad en el teléfono.
fuente
Activity#getWindow().getDecorView().isShown()
?Usé el método MyActivity.class y getCanonicalName y obtuve una respuesta.
fuente
getRunningTasks()
ya que fue obsoleto: androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/…Mucho mejor manera que usar una variable estática y seguir OOP
Shared Preferences
se puede usar para compartir variables con otrosactivities
y servicios de unoapplication
Usa las preferencias compartidas. Tiene la información de estado más confiable, menos problemas de cambio / destrucción de aplicaciones, nos ahorra pedir otro permiso y nos da más control para decidir cuándo nuestra actividad es realmente la más importante. ver detalles aquí abd aquí también
fuente
onStop()
Este es un código para verificar si se está ejecutando un servicio en particular. Estoy bastante seguro de que también puede funcionar para una actividad siempre que cambie getRunningServices con getRunningAppProcesses () o getRunningTasks (). Echa un vistazo aquí http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Cambie Constants.PACKAGE y Constants.BACKGROUND_SERVICE_CLASS en consecuencia
fuente
Hay una manera mucho más fácil que todo lo anterior y este enfoque no requiere el uso
android.permission.GET_TASKS
en el manifiesto, o tiene el problema de las condiciones de carrera o las pérdidas de memoria señaladas en la respuesta aceptada.Hacer una variable ESTÁTICA en la Actividad principal. Static permite que otras actividades reciban los datos de otra actividad.
onPause()
establecer esta variable falsa ,onResume
yonCreate()
establecer esta variable verdadera .Asigna getters y setters de esta variable.
Y luego de otra actividad o servicio
fuente
De los documentos oficiales:
Activity # isFinishing ()
Activity # isDestroyed ()
fuente
gracias kkudi! Pude adaptar tu respuesta al trabajo para una actividad ... esto es lo que funcionó en mi aplicación ...
este ejemplo le dará un verdadero o falso si topActivity coincide con lo que está haciendo el usuario. Entonces, si la actividad que está buscando no se muestra (es decir, está en Pausa), no obtendrá una coincidencia. Además, para hacer esto, debe agregar el permiso a su manifiesto.
¡Espero que esto haya sido útil!
fuente
Creo que la respuesta aceptada es una forma horrible de manejar esto.
No sé cuál es el caso de uso, pero considere un método protegido en la clase base
y anularlo en la clase derivada.
Cuando se produce el evento, simplemente llame a este método en la clase base. La clase 'activa' correcta lo manejará entonces. La clase misma puede verificar si no es así
Paused()
.Mejor aún, use un bus de eventos como GreenRobot's , Square's , pero ese está en desuso y sugiere usar RxJava
fuente
Usé un cheque
if (!a.isFinishing())
y parece hacer lo que necesito.a
es la instancia de actividad. ¿Es esto incorrecto? ¿Por qué nadie intentó esto?fuente
qué pasa
activity.isFinishing()
fuente
ActivityLifecycleCallbacks es una excelente manera de realizar un seguimiento de todas las actividades en la aplicación:
ActivityState:
Extienda la clase de aplicación y proporcione su referencia en el archivo de manifiesto de Android:
Haga clic en cualquier lugar de Actividad para ver el estado de otra actividad:
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
fuente
No estoy seguro de que sea una forma "adecuada" de "hacer cosas".
Si no hay una forma API para resolver la (o una) pregunta de lo que debería pensar un poco, tal vez esté haciendo algo mal y lea más documentos, etc.
(Como entendí, las variables estáticas son una forma comúnmente incorrecta en Android. Por causa podría funcionar, pero definitivamente habrá casos en los que no funcionará [por ejemplo, en producción, en millones de dispositivos]).
Exactamente en su caso, le sugiero que piense por qué necesita saber si otra actividad está viva ... puede comenzar otra actividad para obtener resultados para obtener su funcionalidad. O puede derivar la clase para obtener su funcionalidad, etc.
Atentamente.
fuente
Si está interesado en el estado del ciclo de vida de la instancia específica de la actividad, la solución de siliconagle se ve correcta, excepto que la nueva variable "activa" debería ser una variable de instancia, en lugar de estática.
fuente
Use una transmisión ordenada. Ver http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
En su actividad, registre un receptor en onStart, anule el registro en onStop. Ahora, por ejemplo, cuando un servicio necesita manejar algo que la actividad podría hacer mejor, envíe una transmisión ordenada desde el servicio (con un controlador predeterminado en el propio servicio). Ahora puede responder en la actividad cuando se está ejecutando. El servicio puede verificar los datos de resultados para ver si se manejó la transmisión y, si no, tomar las medidas apropiadas.
fuente
Además de la respuesta aceptada , si tiene varias instancias de la actividad, puede usar un contador en su lugar:
fuente
Has probado..
fuente
Encontramos una solución fácil con el siguiente código
fuente
Use la variable isActivity para verificar si la actividad está viva o no.
Entonces revisa
fuente
Si desea verificar si la actividad está en la pila posterior, simplemente siga los siguientes pasos. 1. Declarado una ArrayList en su clase de Aplicación [La clase de aplicación se define en su archivo mainfest en la etiqueta de la aplicación]
Y agregue los siguientes métodos públicos para acceder y modificar esta lista.
En su BaseActivity, donde todas las actividades lo extienden, anule los métodos onCreate y onDestroy para que pueda agregar y eliminar actividades de la pila posterior de la siguiente manera.
Finalmente, si desea verificar si la actividad está en la pila posterior o no, simplemente llame a esta función esActivityInBackStack.
Por ejemplo: quiero verificar si HomeActivity está en la pila posterior o no:
fuente
fuente
Esto funciona si no tienes la misma actividad en primer plano. Si abres desde la notificación no funciona, hice algunos ajustes y vine con esto:
Eso funciona para mí con varias actividades abiertas al mismo tiempo.
fuente