Comprobar si mi aplicación se está ejecutando en Android
Tengo una aplicación que implica piscina de sonido – Al inicio de la aplicación todos los sonidos se cargan después de que la pantalla principal se carga.
Ahora, quisiera comprobar si la aplicación está funcionando – si no está funcionando quisiera recargar la aplicación – si está funcionando no quiero recargar la aplicación.
Para lo cual probé lo siguiente:
ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE ); List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses(); for(int i = 0; i < procInfos.size(); i++){ if(procInfos.get(i).processName.equals("com.me.checkprocess")) { Log.e("Result", "App is running - Doesn't need to reload"); } else { Log.e("Result", "App is not running - Needs to reload); } }
Esto da los resultados a la perfección, pero sigue comprobando hasta que procInfos.size es menor que 0. Hasta que la aplicación obtiene el proceso com.me.checkprocess true – siempre es falsa? Por lo que siempre se pone en la otra parte primero.
Así por ejemplo: Si el proceso total es 30. Y mi proceso com.me.checkprocess se está ejecutando @ 29th. Cuando se ejecuta la condición. Hasta el 28º proceso es otro y @ 29º proceso se pone en la condición verdadera.
¿Cómo arreglar esta parte – Me gustaría llegar a otra parte sólo después de que el proceso total está marcada?
¡Házmelo saber!
Creo que solo puedes agregar
break;
abajo
Log.e("Result", "App is running - Doesn't need to reload");
Declaración if
in
Basta con poner un descanso en el interior del bucle for.
for(...){ if(){ break; } }
Esto definitivamente no es limpio, pero hace lo que quieres.
** EDIT 2
Creo que sería más fácil si sólo extraer esta tarea en un método.
public boolean isProcessRunning(String process) { ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE ); List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses(); for(int i = 0; i < procInfos.size(); i++){ if (procInfos.get(i).processName.equals(process)) { return true; } } return false; } public static void main(String[] args) { if (isProcessRunning("my_process")) { // Do what you need } else { // restart your app } }
Esto es lo que deberías hacer.
if(procInfos.get(i).processName.equals("com.me.checkprocess")) { Log.e("Result", "App is running - Doesn't need to reload"); break; }
Las otras respuestas enumeradas funcionarán, pero estoy de acuerdo con c4pone – en un bucle como éste, break parece una mala manera de hacerlo – sobre todo porque usar una break
significa que si agregas otra condición alrededor de tu sentencia if, hay una oportunidad Que la break
ya no puede funcionar al salir del bucle for
– de alguna manera es análoga a una declaración goto
en otros idiomas
Otra alternativa a su problema es esta:
for(int i = 0; i < procInfos.size(); i++){ if(procInfos.get(i).processName.equals("com.me.checkprocess")) { Log.e("Result", "App is running - Doesn't need to reload"); i = procInfos.size(); } else { Log.e("Result", "App is not running - Needs to reload); } }
Que también romper el bucle, ya que establece su variable contador a la cláusula de terminación, es decir, una vez que se encuentra, el bucle de salida.
EDITAR:
Después del comentario del OP abajo, tengo la sensación de que la solución que él quiere es la siguiente:
boolean found = false; for(int i = 0; i < procInfos.size(); i++){ if(procInfos.get(i).processName.equals("com.me.checkprocess")) { found = true; } } if(found) { Log.e("Result", "App is running - Doesn't need to reload"); i = procInfos.size(); } else { Log.e("Result", "App is not running - Needs to reload); }
Lo que no tiene nada que ver con salir del bucle prematuramente, como todos nosotros pensamos al leer la pregunta, sino que es en vez de producir el resultado una vez
public static boolean isAppRunning(Context context) {
// comprobar con la primera tarea (tarea en primer plano) // en la lista de tareas devueltas
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); if (services.get(0).topActivity.getPackageName().toString().equalsIgnoreCase(context.getPackageName().toString())) { return true; } return false; }