Verifica si la actividad está activa

Tengo un problema con un oyente en cierta actividad.

El problema es que este oyente contiene un alert.show (); que se puede llamar después de que intentamos impulsar una nueva actividad (que luego da una excepción).

por ejemplo: estoy escuchando en la actividad A una señal de otro teléfono. Presiono hacia atrás y trato de ejecutar una nueva actividad B pero el progtwig falla debido al listener de alert.show () A.

ERROR/AndroidRuntime(3573): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@476c21c0 is not valid; is your activity running? 

¿Puedo verificar al oyente de A si esta actividad está activa y luego mostrar la alerta o no según este valor?

Puede que haya una manera más fácil en la que no puedo pensar, pero una forma es implementarla tú mismo. En onResume() establece una variable miembro mIsRunning en true y en onPause() vuelve a false. Usando este booleano, debe saber que no debe llamar a alert.show() en su callback.

 ArrayList runningactivities = new ArrayList(); ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE); List services = activityManager.getRunningTasks(Integer.MAX_VALUE); for (int i1 = 0; i1 < services.size(); i1++) { runningactivities.add(0,services.get(i1).topActivity.toString()); } if(runningactivities.contains("ComponentInfo{com.app/com.app.main.MyActivity}")==true){ Toast.makeText(getBaseContext(),"Activity is in foreground, active",1000).show(); alert.show() } 

De esta forma sabrá si la actividad señalada es la actividad visible actual, de lo contrario su alerta no se mostrará.

Esto solo funcionará cuando naveguemos entre dos actividades sin finalizar.

Esto sucede cuando la actividad sufrirá su destrucción cuando el hilo de fondo termine su trabajo e intente mostrar un cuadro de diálogo.

Esta excepción es rara de reproducir, pero ocurre cuando realizamos alguna operación asincrónica de tareas / fondos y queremos mostrar un diálogo con el contexto de la Actividad y, mientras tanto, nuestra actividad se está destruyendo por algún motivo.

El sistema operativo Android debe manejar esta situación, pero a partir de ahora no es así.

por lo tanto, antes de llamar a su diálogo simplemente verifique si la actividad se está ejecutando y no está en su fase de destrucción.

 if(!isFinishing()){ callDialog(); } 

La secuencia de fondo después de finalizar sus tareas de red invoca la callback en el éxito () / onFailure () en el hilo principal. Y si en ese momento, la actividad que inició esta tarea de subproceso en segundo plano no está en primer plano e intenta utilizar getActivity () en onSuccess () / onFailure (), le dará la excepción. Intente agregar esta comprobación antes de realizar cualquier operación de UI.

 if(!((Activity) context).isFinishing()) { //show alert } 

Sí, puede verificar si la actividad está activa: actualizar una actividad del servicio cuando está activo

Además, si no estás haciendo nada cuando tu actividad no está activa, probablemente deberías anular el registro del oyente cuando tu actividad se desactive.

Estaba teniendo 2 actividades A y B, solo quería saber si la actividad B se está ejecutando o no de A.

Inicialmente seguí “RunningTaskInfo” para resolver el problema. No funcionaba al 100%.

Así que creé una solución propia, publicaré mi solución. Usando la clase HashMap y AtomicBoolean.

 public class ActivityStateTracker { final private Map mMap = new HashMap(); private static ActivityStateTracker instance = null; /** * SingletonClass * */ private ActivityStateTracker() { } public static ActivityStateTracker getInstance(String activityName, boolean defaultVal) { if(instance == null) { instance = new ActivityStateTracker(); } instance.setDefaultValue(activityName, defaultVal); return instance; } private void setDefaultValue(String activityName, boolean defaultVal) { mMap.put(activityName, new AtomicBoolean(defaultVal)); } public boolean isRunning(String activityName) { final AtomicBoolean atomicBool = mMap.get(activityName); return (mMap.get(activityName) == null) ? false : atomicBool.get(); } public void setChangeState(String activityName, boolean value) { final AtomicBoolean atomicBool = mMap.get(activityName); if(atomicBool == null) { setDefaultValue(activityName, value); } else { atomicBool.set(value); mMap.put(activityName, atomicBool); } } 

}

Ahora en la Actividad B.

  public static final String TAG = "EditScreenPopupActivity"; static ActivityStateTracker mActivityState = ActivityStateTracker.getInstance(TAG, false); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivityState.setChangeState(TAG, true); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_traslucent); } @Override protected void onDestroy() { mActivityState.setChangeState(TAG, false); super.onDestroy(); } 

Ahora en la Actividad A.

 public static final String TAG = "ToolTipPopupActivity"; static ActivityStateTracker mActivityState = ActivityStateTracker.getInstance(TAG, false); /** Check Edit screen activity is running or not? */ if(mActivityState.isRunning("EditScreenPopupActivity")) { finish(); } 

………………………………..

Esta solución está funcionando correctamente en mi caso. Espero que te ayude también …