2010-07-16 16 views
22

Ho usato Toast per fare la notifica, ma sembra che apparirà anche se la sua attività non è nella schermata corrente e sono state avviate altre attività.Come verificare se la mia attività è l'attività corrente in esecuzione sullo schermo

Voglio verificare questa situazione, quando l'attività non è quella corrente, non invierò la notifica Toast. Ma come fare?

+0

possibile duplicato del [Verificando un'applicazione Android è in esecuzione in background] (http: // StackOverflow. it/questions/3667022/check-if-an-android-application-is-running-in-the-background) – rds

risposta

79

Quando l'attività viene portata in primo piano, verrà richiamato il suo metodo onResume(). Quando un'altra attività si trova di fronte all'attività, verrà invocato il suo metodo onPause(). Quindi tutto quello che dovete fare è implementare un valore booleano che indica se la vostra attività è in primo piano:

private boolean isInFront; 

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

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

Esiste un metodo conveniente? come Activety :: isActive() – virsir

+7

Non ho mai incontrato o utilizzato un tale metodo, ma la soluzione di cui sopra è molto conveniente, a mio parere. –

+0

Questa risposta è un'implementazione più 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(); 
} 

In questo modo si saprà se l'attività a punta è la corrente visibile attività.

+0

è obsoleto. Ed è rimosso in Android 6. – Thirumalvalavan

2

Questa è la mia funzione finaleAttivitàVisibile.

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

Preferisco non gestire lo stato da solo, quindi ho implementato una classe che fa questo per me.

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

Allora la vostra attività può estendere questo uno e si può ottenere lo stato chiamando 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); 
      } 

//// qui sono tutto le mie attività si estendono su attività denominata BaseActivity

+1

lavoro per me ... grazie ... !!! –

-3
if (getActivity() instanceof ManageCardActivity){ 

    // your code 
    } 
Problemi correlati