studio name icon change application app android background foreground

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



change icon app android studio (4)

Tengo un temporizador que inicia una notificación cuando termina. Pero me gustaría activar una notificación utilizando notificationManager solo si la aplicación no está visible actualmente, y mostrar un alertDialog si el temporizador finaliza 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 está en primer plano o no. ¿Cómo puedo hacer esto?


Pero me gustaría activar una notificación utilizando notificationManager solo si la aplicación no está visible actualmente, y mostrar un alertDialog si el temporizador finaliza mientras la aplicación está en primer plano.

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

Aquí hay una entrada de blog que describe esta técnica.

ACTUALIZACIÓN 2018-01-04 : El enfoque descrito anteriormente funciona, pero involucra transmisiones del sistema, lo cual no es una gran opción para la mayoría de las aplicaciones (de proceso único). En su lugar, se puede utilizar un bus de eventos ( LocalBroadcastManager , EventBus de greenrobot), con mejor rendimiento y seguridad. Vea esta aplicación de muestra que usa LocalBroadcastManager y esta aplicación de muestra que usa EventBus de greenrobot , ambas implementan este patrón.


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"); }

EDITAR: Si desea verificar una actividad específica (clase) use esto;

if (uygulamaIslemi.processName.equals("com.TRSoft.timetab:PIN")) { if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) // Lanet olasıca şey Visible ile Foreground arasındaki fark ne oç illaha ya da yı kullanarak olduğunu keşfetmem mi lazım! { return true; } }

Y en tu archivo de manifiesto:

<activity android:name=".PINSayfasi" android:process=":PIN"></activity>

Así que la lógica principal es la apertura y el proceso de lectura.


Le aconsejaría que utilice un Service 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 vuelva a la interfaz de usuario, el servicio debe llamar explícitamente al subproceso de la interfaz de usuario, de lo contrario obtendrá errores ANR, ya que el subproceso de la interfaz de usuario no es seguro para subprocesos.

Lea este documento, ¡debería ayudarlo a obtener una mejor solución para lo que está tratando de hacer!

Espero que esto haya ayudado


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

En toda tu Activity , establece:

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

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

Luego cree un VisibilityManager (este es muy básico, puede 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 de tu temporizador, cuando la cuenta regresiva llegó a cero:

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

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