Android: ¿cómo puedo comprobar si la actividad se está ejecutando?
¿Existe alguna forma sencilla de determinar si una determinada actividad está activa o no? Quiero hacer ciertas cosas dependiendo de la actividad que esté activa. p.ej:
if(activityrunning == activity1) //do this else if (activityrunning == activity2) //do something else
- ¿Cómo pasar datos complejos entre Servicio y Actividad?
- Acceso a bases de datos en Android
- Cómo iniciar la actividad después de presionar el botón widget?
- Determine el estado vacío del fragmento backstack en android
- ¿Cómo inicio otra aplicación (descargada o preinstalada) de una actividad?
- Patrón de comandos para pasar los métodos de actividad de la aplicación?
- ¿Cómo mostrar y ocultar el ProgressBar de una actividad desde un AsyncTask?
- ¿Cómo pasar una variable de Actividad a Fragmento y devolverla?
- ¿Qué hace el atributo android: configChanges = "screenSize"?
- Relación entre android: noHistory y android: finishOnTaskLaunch
- Android, Build Successful, pero apk build (posterior ejecución) falla
- ¿Cómo haces que un acceso directo de "Inicio" de Android evite la aplicación?
- Adaptador de matriz de Android con ArrayList y ListView no se actualizan cuando se cambia el arraylist
Puede utilizar una variable static
dentro de la actividad.
class MyActivity extends Activity { static boolean active = false; @Override public void onStart() { super.onStart(); active = true; } @Override public void onStop() { super.onStop(); active = false; } }
El único gotcha es que si lo usas en dos actividades que se enlazan entre sí, entonces onStop
en el primero a veces se llama después de onStart
en segundo. Así que ambos pueden ser verdaderos brevemente.
Dependiendo de lo que intentes hacer (actualizar la actividad actual de un servicio?). Usted podría apenas registrar un oyente estático en el servicio en su método del onStart
actividad entonces el oyente correcto estará disponible cuando su servicio desea poner al día la interfaz de usuario.
Creo que más claro como eso:
public boolean isRunning(Context ctx) { ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE); for (RunningTaskInfo task : tasks) { if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) return true; } return false; }
Mucho mejor manera de usar una variable estática y después de OOP
Shared Preferences
se pueden usar para compartir variables con otras activities
y servicios de una application
public class example extends Activity { @Override protected void onStart() { super.onStart(); // Store our shared preference SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE); Editor ed = sp.edit(); ed.putBoolean("active", true); ed.commit(); } @Override protected void onStop() { super.onStop(); // Store our shared preference SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE); Editor ed = sp.edit(); ed.putBoolean("active", false); ed.commit(); } }
Utilice preferencias compartidas. Tiene la información de estado más confiable, menos problemas de conmutación / 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 alta. Ver los detalles aqui abd aquí también
Este es el código para comprobar si un servicio en particular se está ejecutando. Estoy bastante seguro de que puede trabajar para una actividad también, siempre y cuando cambie getRunningServices con getRunningAppProcesses () o getRunningTasks (). Echa un vistazo aquí http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Cambiar Constants.PACKAGE y Constants.BACKGROUND_SERVICE_CLASS en consecuencia
public static boolean isServiceRunning(Context context) { Log.i(TAG, "Checking if service is running"); ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); boolean isServiceFound = false; for (int i = 0; i < services.size(); i++) { if (Constants.PACKAGE.equals(services.get(i).service.getPackageName())){ if (Constants.BACKGROUND_SERVICE_CLASS.equals(services.get(i).service.getClassName())){ isServiceFound = true; } } } Log.i(TAG, "Service was" + (isServiceFound ? "" : " not") + " running"); return isServiceFound; }
Utilicé el método MyActivity.class y getCanonicalName y obtuve respuesta.
protected Boolean isActivityRunning(Class activityClass) { ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE); for (ActivityManager.RunningTaskInfo task : tasks) { if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName())) return true; } return false; }
Una opción sin usar ninguna variable auxiliar es:
Activity#getWindow().getDecorView().getRootView().isShown()
El valor devuelto por esta expresión cambia en onStart () / onStop (), que son los eventos que empiezan / dejan de mostrar el diseño de la actividad en el teléfono.
Gracias kkudi! He podido adaptar tu respuesta al trabajo para una actividad … esto es lo que funcionó en mi aplicación.
public boolean isServiceRunning() { ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); isServiceFound = false; for (int i = 0; i < services.size(); i++) { if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) { isServiceFound = true; } } return isServiceFound; }
Este ejemplo le dará una verdadera o falsa si la topActivity coincide con lo que el usuario está haciendo. Así que si la actividad de su comprobación para no se muestra (es decir, es onPause), entonces no obtendrá un partido. También, para hacer esto usted necesita agregar el permiso a su manifiesto.
<uses-permission android:name="android.permission.GET_TASKS"/>
Espero que esto fue útil!
Hay una manera mucho más fácil que todo lo anterior y este enfoque no requiere el uso de android.permission.GET_TASKS
en el manifiesto, o tener el problema de las condiciones de carrera o fugas de memoria señalado en la respuesta aceptada.
-
Establecer una variable STATIC en la actividad principal. La estática permite que otras actividades reciban los datos de otra actividad.
onPause()
establece esta variable false ,onResume
yonCreate()
establecen esta variable true .private static boolean mainActivityIsOpen;
-
Asigne getters y setters de esta variable.
public static boolean mainActivityIsOpen() { return mainActivityIsOpen; } public static void mainActivityIsOpen(boolean mainActivityIsOpen) { DayView.mainActivityIsOpen = mainActivityIsOpen; }
-
Y luego de otra actividad o servicio
if (MainActivity.mainActivityIsOpen() == false) { //do something } else if(MainActivity.mainActivityIsOpen() == true) {//or just else. . . ( or else if, does't matter) //do something }
Creo que la respuesta aceptada es una manera horrible de manejar esto.
No sé cuál es el caso de uso, pero por favor considere un método protegido en la clase base
@protected void doSomething() { }
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 en sí puede comprobar si no es Paused()
.
Mejor aún, utilice un bus de eventos como GreenRobot's , Square's , pero éste está obsoleto y sugiere usar RxJava
No estoy seguro de que sea una forma "correcta" de "hacer cosas".
Si no hay una forma de API para resolver la (o una) pregunta de lo que debería pensar un poco, tal vez está haciendo algo mal y lee más documentos en su lugar.
(Como he entendido las variables estáticas es una forma comúnmente errónea en android. Por supuesto, podría funcionar, pero definitivamente habrá casos cuando no funcionará [por ejemplo, en la producción, en millones de dispositivos]).
Exactamente en su caso le sugiero pensar ¿por qué necesita saber si otra actividad está viva? .. puede iniciar otra actividad para obtener resultados para obtener su funcionalidad. O puede derivar la clase para obtener su funcionalidad y así sucesivamente.
Atentamente.
Si está interesado en el estado del ciclo de vida de la instancia específica de la actividad, la solución de siliconeagle parece correcta, excepto que la nueva variable "activa" debería ser una variable de instancia en lugar de estática.
Utilice una emisión ordenada. Ver http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
En su actividad, registre un receptor en onStart, cancele el registro en onStop. Ahora, cuando por ejemplo un servicio necesita manejar algo que la actividad podría ser capaz de hacer mejor, enviar una emisión ordenada desde el servicio (con un manejador predeterminado en el servicio en sí). Ahora puede responder en la actividad cuando se está ejecutando. El servicio puede comprobar los datos de resultado para ver si la emisión fue manejada, y si no toma la acción apropiada.
Utilicé un cheque if (!a.isFinishing())
y parece hacer lo que necesito. a
es la instancia de actividad. ¿Es esto incorrecto? ¿Por qué nadie lo intentó?
Encontrado una solución fácil con el código siguiente
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { // Activity is being brought to front and not being created again, // Thus finishing this activity will bring the last viewed activity to foreground finish(); } }
Además de la respuesta aceptada , si tiene varias instancias de la actividad, puede utilizar un contador en su lugar:
class MyActivity extends Activity { static int activeInstances = 0; static boolean isActive() { return (activeInstance > 0) } @Override public void onStart() { super.onStart(); activeInstances++; } @Override public void onStop() { super.onStop(); activeInstances--; } }