2010-07-16 24 views
22

Utilicé Toast para hacer notificaciones, pero parece que aparecerá aunque su actividad no esté en la pantalla actual y se haya iniciado alguna otra actividad.Cómo comprobar si mi actividad es la actividad actual que se ejecuta en la pantalla

Quiero comprobar esta situación, cuando la actividad no es la actual, no enviaría la notificación de Toast. Pero, ¿cómo hacerlo?

+0

posible duplicado de [Comprobación de si una aplicación Android se ejecuta en segundo plano] (http: // stackoverflow. com/questions/3667022/checking-if-an-android-application-is-running-in-the-background) – rds

Respuesta

79

Cuando su actividad pase a primer plano, se invocará su método onResume(). Cuando otra actividad aparece en frente de tu actividad, se invocará su método onPause(). Así que todo lo que necesita hacer es aplicar un valor booleano que indica si su actividad está en primer plano:

private boolean isInFront; 

@Override 
public void onResume() { 
    super.onResume(); 
    isInFront = true; 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    isInFront = false; 
} 
+2

¿Existe algún método conveniente? como Activety :: isActive() – virsir

+7

No me he encontrado personalmente ni he usado dicho método, pero la solución anterior también es muy conveniente, en mi opinión. –

+0

Esta respuesta es una implementación más robusta http://stackoverflow.com/questions/3667022/android-is-application-running-in-background/5862048#5862048 – Moak

7
ArrayList<String> runningactivities = new ArrayList<String>(); 

ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE); 

List<RunningTaskInfo> 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(); 
} 

De esta manera usted sabrá si la actividad puntas es la corriente visibles actividad.

+0

método getRunningTasks está en desuso. Y se elimina en Android 6. – Thirumalvalavan

2

Esta es mi última función isActivityVisible.

protected boolean isActivityVisible() { 
    if (this.mActivity != null) { 
     Class klass = this.mActivity.getClass(); 
     while (klass != null) { 
      try { 
       Field field = klass.getDeclaredField("mResumed"); 
       field.setAccessible(true); 
       Object obj = field.get(this.mActivity); 
       return (Boolean)obj; 
      } catch (NoSuchFieldException exception1) { 
//    Log.e(TAG, exception1.toString()); 
      } catch (IllegalAccessException exception2) { 
//    Log.e(TAG, exception2.toString()); 
      } 
      klass = klass.getSuperclass(); 
     } 
    } 
    return false; 
} 
2

Prefiero no manejar el estado por mi cuenta, así que he implementado una clase que hace esto por mí.

package mypackage; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 

// Mine extends AppCompatActivity - your's might need to extend Activity, depending on whether 
// you use the support library or not. 
public class StateTrackingActivity extends AppCompatActivity { 

    public enum ActivityState { 

     CREATED, RESUMED, STARTED, PAUSED, STOPPED, DESTROYED 
    } 

    private ActivityState _activityState; 

    protected ActivityState getActivityState() { return _activityState; } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     _activityState = ActivityState.CREATED; 
    } 

    @Override 
    protected void onResume() { 

     super.onResume(); 
     _activityState = ActivityState.RESUMED; 
    } 

    @Override 
    protected void onStart() { 

     super.onStart(); 
     _activityState = ActivityState.STARTED; 
    } 

    @Override 
    protected void onPause() { 

     super.onPause(); 
     _activityState = ActivityState.PAUSED; 
    } 

    @Override 
    protected void onStop() { 

     super.onStop(); 
     _activityState = ActivityState.STOPPED; 
    } 

    @Override 
    protected void onDestroy() { 

     super.onDestroy(); 
     _activityState = ActivityState.DESTROYED; 
    } 
} 

Luego, su actividad se puede extender éste y se puede obtener el estado llamando getActivityState().

1
if (BaseActivity.this instanceof Faq) 
      { 
       Toast.makeText(BaseActivity.this, "You are in the Same Page", Toast.LENGTH_SHORT).show(); 
      }else { 
       Intent intent = new Intent(BaseActivity.this, Faq.class); 
       startActivity(intent); 
       drawer.closeDrawer(GravityCompat.START); 
      } 

//// aquí Soy todas mis actividades están extendiendo sobre la actividad llamada BaseActivity

+1

trabajo para mí ... gracias ... !!! –

-3
if (getActivity() instanceof ManageCardActivity){ 

    // your code 
    } 
Cuestiones relacionadas