¿Cómo saber si mi aplicación Android es visible?

Tengo un temporizador que inicia una notificación cuando termina. Pero me gustaría disparar una notificación usando notificationManager sólo si la aplicación no está visible en ese momento y mostrar un alertDialog si el temporizador termina mientras la aplicación está en primer plano.

Ya lo he intentado con esto:

ActivityManager actMngr = (ActivityManager) ValeoMobileApplication.getContext().getSystemService(Activity.ACTIVITY_SERVICE); List<RunningAppProcessInfo> runningAppProcesses = actMngr.getRunningAppProcesses(); Tools.log("TimerBroadcastReceiver", "onReceive", "All running processes are listed below :"); for (RunningAppProcessInfo pi : runningAppProcesses) { //Check pi.processName and do your stuff //also check pi importance - check if process is in foreground or background Tools.log("TimerBroadcastReceiver", "onReceive", pi.processName + " importance = "+pi.importance); if(pi.processName.equalsIgnoreCase("MY_APP_PROCESS_NAME")){ if (pi.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { isApplicationInForeground = true; } } } 

Pero parece que no importa si la aplicación es en primer plano o no. ¿Cómo puedo hacer esto?

Pero me gustaría disparar una notificación usando notificationManager sólo si la aplicación no está visible en ese momento y mostrar un alertDialog si el temporizador termina mientras la aplicación está en primer plano.

Utilice una transmisión ordenada, con la actividad que tenga un receptor de alta prioridad si está en primer plano, además de un receptor con registro de manifiesto para los casos cuando no esté en primer plano.

Esta es una entrada de blog que describe esta técnica. Aquí hay un ejemplo de proyecto que demuestra esta técnica.

Puede detectar si su aplicación está visible o no de la siguiente manera:

En toda su Activity , establezca:

 @Override protected void onResume() { super.onResume(); myVisibilityManager.setIsVisible(true); } @Override protected void onPause() { myVisibilityManager.setIsVisible(false); super.onPause(); } 

(Esto puede llevarte a definir una superclase para todas tus actividades que implementarían este comportamiento)

A continuación, crear un VisibilityManager (éste es muy básico, es posible que necesite algo más avanzado):

 public class VisibilityManager { private boolean mIsVisible = false; public void setIsVisible(boolean visible) { mIsVisible = visible; } public boolean getIsVisible() { return mIsVisible; } } 

Y luego, en el hilo del temporizador, cuando la cuenta regresiva llegó a cero:

 if (VisibilityManager.getIsVisible()) { showAlertDialog(); } else { showNotification(); } 

EDIT: pero incluso prefiero el enfoque de CommonsWare descrito aquí en esta página. Es más elegante.

Le aconsejo que utilice un Servicio en lugar de una actividad en este caso.

Un servicio se ejecuta en segundo plano y no se ve afectado por el ciclo de vida de la actividad si se inicia correctamente.

Una cosa importante a recordar es que cuando se vuelve a la interfaz de usuario, el servicio debe llamar explícitamente a la interfaz de usuario de hilo, de lo contrario obtendrá ANR errores, ya que el hilo de interfaz de usuario no es threadsafe.

Por favor, lea ese documento, que debe ayudarle a obtener una mejor solución para lo que está tratando de hacer!

Espero que esto ayudó

Aquí está la solución:

 public static boolean uygulamaCalisiyormu(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> islemler = activityManager.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo uygulamaIslemi : islemler) { if (uygulamaIslemi.processName.equals(context.getPackageName())) { if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } } return false; } ... if (uygulamaCalisiyormu(getApplicationContext())) { Log.d("asd","App Already Started"); } else { Log.d("asd","App Started"); } 

Si

GetIntent ()

Devuelve null su actividad no está en primer plano.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.