wake-up-neo.com

Android: Wie überprüfe ich, ob Aktivitäten ausgeführt werden?

Gibt es eine einfache Möglichkeit, festzustellen, ob eine bestimmte Aktivität aktiv ist oder nicht? Ich möchte bestimmte Dinge tun, je nachdem, welche Aktivität aktiv ist. 

if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
121
user560571

Sie können eine static-Variable innerhalb der Aktivität verwenden.

class MyActivity extends Activity {
     static boolean active = false;

      @Override
      public void onStart() {
         super.onStart();
         active = true;
      } 

      @Override
      public void onStop() {
         super.onStop();
         active = false;
      }
}

Das einzige Problem ist, dass, wenn Sie es in zwei Aktivitäten verwenden, die miteinander verbunden sind, onStop in der ersten manchmal nach onStart in der Sekunde aufgerufen wird. Beides könnte kurz sein.

Abhängig davon, was Sie versuchen (Aktualisierung der aktuellen Aktivität von einem Dienst?). Sie können einfach einen statischen Listener im Dienst in Ihrer Aktivitätsmethode onStart registrieren. Der korrekte Listener ist dann verfügbar, wenn Ihr Dienst die Benutzeroberfläche aktualisieren möchte.

193
siliconeagle

Ich denke klarer so:

  public boolean isRunning(Context ctx) {
        ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (RunningTaskInfo task : tasks) {
            if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) 
                return true;                                  
        }

        return false;
    }
36
Xenione

Weitaus besser als eine statische Variable und OOP

Shared Preferences kann verwendet werden, um Variablen mit anderen activities und Services von einer application zu teilen.

    public class example extends Activity {

    @Override
    protected void onStart() {
        super.onStart();

        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", true);
        ed.commit();
    }

    @Override
    protected void onStop() {
        super.onStop();

        // Store our shared preference
        SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE);
        Editor ed = sp.edit();
        ed.putBoolean("active", false);
        ed.commit();

    }
}

Verwenden Sie gemeinsame Einstellungen. Es verfügt über die zuverlässigsten Statusinformationen, weniger Probleme beim Wechseln und Zerstören von Anwendungen, erspart uns die Erteilung einer weiteren Erlaubnis und gibt uns mehr Kontrolle, um zu entscheiden, wann unsere Aktivität tatsächlich die höchste ist. Details hier abd hier auch

24
Xar E Ahmer

Ich habe die Methode MyActivity.class und getCanonicalName verwendet und erhielt die Antwort.

protected Boolean isActivityRunning(Class activityClass)
{
        ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (ActivityManager.RunningTaskInfo task : tasks) {
            if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
                return true;
        }

        return false;
}
20
mahyar

Eine Option ohne Zusatzvariable lautet:

activity.getWindow().getDecorView().getRootView().isShown()

wobei Aktivität f.e .: this oder getActivity () ist.

Der von diesem Ausdruck zurückgegebene Wert ändert sich in onStart ()/onStop (). Hierbei handelt es sich um die Ereignisse, die das Layout der Aktivität auf dem Telefon starten oder stoppen.

18
GaRRaPeTa

Dies ist ein Code zum Überprüfen, ob ein bestimmter Dienst ausgeführt wird. Ich bin ziemlich sicher, dass es auch für eine Aktivität funktionieren kann, solange Sie getRunningServices mit getRunningAppProcesses () oder getRunningTasks () ändern. Schauen Sie hier http://developer.Android.com/reference/Android/app/ActivityManager.html#getRunningAppProcesses ()

Ändern Sie Constants.PACKAGE und Constants.BACKGROUND_SERVICE_CLASS entsprechend

    public static boolean isServiceRunning(Context context) {

    Log.i(TAG, "Checking if service is running");

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

    List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);

    boolean isServiceFound = false;

    for (int i = 0; i < services.size(); i++) {

        if (Constants.PACKAGE.equals(services.get(i).service.getPackageName())){

            if (Constants.BACKGROUND_SERVICE_CLASS.equals(services.get(i).service.getClassName())){
                isServiceFound = true;
            }
        }
    }

    Log.i(TAG, "Service was" + (isServiceFound ? "" : " not") + " running");

    return isServiceFound;

}
9
kkudi

danke kkudi! Ich konnte Ihre Antwort an die Arbeit für eine Aktivität anpassen ... Hier ist, was in meiner App funktioniert.

public boolean isServiceRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isServiceFound = false; 
    for (int i = 0; i < services.size(); i++) { 
        if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) {
            isServiceFound = true;
        }
    } 
    return isServiceFound; 
} 

in diesem Beispiel erhalten Sie true oder false, wenn topActivity mit dem übereinstimmt, was der Benutzer gerade tut. Wenn also die Aktivität, für die Sie eine Prüfung durchführen, nicht angezeigt wird (d. H. "OnPause"), erhalten Sie keine Übereinstimmung. Dazu müssen Sie Ihrem Manifest die Berechtigung hinzufügen.

<uses-permission  Android:name="Android.permission.GET_TASKS"/>

Ich hoffe das war hilfreich!

6
alyon2002

Ich denke, die akzeptierte Antwort ist eine schreckliche Art, damit umzugehen.

Ich weiß nicht, was der Anwendungsfall ist, aber berücksichtigen Sie eine geschützte Methode in der Basisklasse

@protected
void doSomething() {
}

und überschreiben Sie es in der abgeleiteten Klasse. 

Wenn das Ereignis eintritt, rufen Sie einfach diese Methode in der Basisklasse auf. Die korrekte "aktive" Klasse wird dann damit umgehen. Die Klasse selbst kann dann prüfen, ob es sich nicht um Paused() handelt.

Besser noch, verwenden Sie einen Event-Bus wie GreenRobot's , Square's , aber dieser ist veraltet und schlägt vor, RxJava zu verwenden.

4
Boy

Mir ist klar, dass dieses Problem ziemlich alt ist, aber ich denke, es lohnt sich immer noch, meine Lösung zu teilen, da es für andere nützlich sein könnte.

Diese Lösung war vor der Veröffentlichung von Android Architecture Components nicht verfügbar.

Aktivität ist zumindest teilweise sichtbar

getLifecycle().getCurrentState().isAtLeast(STARTED)

Aktivität steht im Vordergrund

getLifecycle().getCurrentState().isAtLeast(RESUMED)
3
malinjir

Es gibt einen viel einfacheren Weg als alles oben genannte und dieser Ansatz erfordert nicht die Verwendung von Android.permission.GET_TASKS im Manifest oder das Problem der Rassenbedingungen oder des Speicherlecks in der akzeptierten Antwort.

  1. Machen Sie eine STATIC-Variable in der Hauptaktivität. Mit Static können andere Aktivitäten die Daten von einer anderen Aktivität erhalten. onPause() diese Variable setzen false , onResume und onCreate() diese Variable true setzen.

    private static boolean mainActivityIsOpen;
    
  2. Weisen Sie Getter und Setter dieser Variablen zu.

    public static boolean mainActivityIsOpen() {
        return mainActivityIsOpen;
    }
    
    public static void mainActivityIsOpen(boolean mainActivityIsOpen) {
        DayView.mainActivityIsOpen = mainActivityIsOpen;
    }
    
  3. Und dann von einer anderen Aktivität oder Dienstleistung

    if (MainActivity.mainActivityIsOpen() == false)
    {
                    //do something
    }
    else if(MainActivity.mainActivityIsOpen() == true)
    {//or just else. . . ( or else if, does't matter)
            //do something
    }
    
3
coolcool1994

was ist mit activity.isFinishing()

2
Ambareesh B

ActivityLifecycleCallbacks ist eine großartige Möglichkeit, um alle Aktivitäten in App zu verfolgen:

public class BaseActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {

private ActivityState homeState, contentState;

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.CREATED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.CREATED;
    }
}

@Override
public void onActivityStarted(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STARTED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STARTED;
    }
}

@Override
public void onActivityResumed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.RESUMED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.RESUMED;
    }
}

@Override
public void onActivityPaused(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.PAUSED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.PAUSED;
    }
}

@Override
public void onActivityStopped(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.STOPPED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.STOPPED;
    }
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}

@Override
public void onActivityDestroyed(Activity activity) {
    if (activity instanceof HomeActivityv2) {
        homeState = ActivityState.DESTROYED;
    } else if (activity instanceof ContentDisplayActivity) {
        contentState = ActivityState.DESTROYED;
    }
}

public ActivityState getHomeState() {
    return homeState;
}

public ActivityState getContentState() {
    return contentState;
}
}

Aktivitätsstatus:

public enum ActivityState {
    CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED;
}

Erweitern Sie die Anwendungsklasse und geben Sie ihre Referenz in der Android-Manifest-Datei an:

import Android.app.Application;

public final class BaseApplication extends Application {
private BaseActivityLifecycleCallbacks baseALC;

@Override
public void onCreate() {
    super.onCreate();
    baseALC = new BaseActivityLifecycleCallbacks();
    this.registerActivityLifecycleCallbacks(baseALC);

}

public BaseActivityLifecycleCallbacks getBaseALC() {
    return baseALC;
}
}

Checkt irgendwo aus Aktivität für Status der anderen Aktivität:

private void checkAndLaunchHomeScreen() {
    Application application = getApplication();
    if (application instanceof BaseApplication) {
        BaseApplication baseApplication = (BaseApplication) application;
        if (baseApplication.getBaseALC().getHomeState() == null || baseApplication.getBaseALC().getHomeState() == ActivityState.DESTROYED) {
            //Do anything you want
        }
    }
}

https://developer.Android.com/reference/Android/app/Application.ActivityLifecycleCallbacks.html

2
Suyash Gupta

Zusätzlich zu der akzeptierten Antwort können Sie stattdessen einen Zähler verwenden, wenn Sie mehrere Aktivitäten haben

class MyActivity extends Activity {

     static int activeInstances = 0;

     static boolean isActive() {
        return (activeInstance > 0)
     }

      @Override
      public void onStart() {
         super.onStart();
         activeInstances++;
      } 

      @Override
      public void onStop() {
         super.onStop();
         activeInstances--;
      }
}
1
james_alvarez

Ich habe einen Check if (!a.isFinishing()) verwendet und scheint das zu tun, was ich brauche. a ist die Aktivitätsinstanz. Ist das falsch? Warum hat niemand das versucht?

1
lxknvlk

Verwenden Sie eine geordnete Sendung. Siehe http://Android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html

Registrieren Sie in Ihrer Aktivität einen Empfänger in onStart und die Registrierung in onStop. Wenn ein Dienst beispielsweise mit etwas umgehen muss, das durch die Aktivität möglicherweise besser erreicht werden kann, senden Sie eine vom Dienst bestellte Rundsendung (mit einem Standardhandler im Dienst selbst). Sie können jetzt auf die Aktivität reagieren, wenn sie ausgeführt wird. Der Dienst kann die Ergebnisdaten überprüfen, um zu sehen, ob die Übertragung abgewickelt wurde, und wenn nicht, können Sie geeignete Maßnahmen ergreifen.

1
nickmartens1980
if(!activity.isFinishing() && !activity.isDestroyed())
1
Codelicious

Hast du es versucht.. 

    if (getActivity() instanceof NameOfYourActivity){
        //Do something
    }
1
E.Mathew

Nicht sicher, ob es sich um eine "richtige" Art handelt, "Dinge zu tun".
Wenn es keine API-Methode gibt, um die (oder eine) Frage zu lösen, als Sie ein wenig bedenken sollten, machen Sie vielleicht etwas falsch und lesen stattdessen mehr Dokumente usw.
(Wie ich verstanden habe, sind statische Variablen in Android ein allgemein falscher Weg. Natürlich könnte es funktionieren, aber es wird definitiv Fälle geben, in denen es nicht funktioniert [zum Beispiel in der Produktion auf Millionen Geräten]).
Genau in Ihrem Fall schlage ich vor, warum zu prüfen, ob Sie wissen müssen, ob eine andere Aktivität am Leben ist? Oder Sie können die Klasse ableiten, um ihre Funktionalität usw. zu erhalten.
Freundliche Grüße.

1
user2399321

Wenn Sie an dem Lebenszyklusstatus der bestimmten Instanz der Aktivität interessiert sind, sieht die Lösung von siliconeagle korrekt aus, außer dass die neue "aktive" Variable eine Instanzvariable und keine statische sein sollte.

1
Jonathan Taylor

Es wurde eine einfache Problemumgehung mit dem folgenden Code gefunden

@Override 
protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
                // Activity is being brought to front and not being  created again, 
                // Thus finishing this activity will bring the last viewed activity to foreground
                finish(); 
            } 
    }
0
Varun Bhatia

Verwenden Sie die Variable isActivity, um zu prüfen, ob Aktivität aktiv ist oder nicht.

private boolean activityState = true;

 @Override
protected void onDestroy() {
    super.onDestroy();
    activityState = false;
}

Dann überprüfe 

if(activityState){
//add your code
}
0
Faran Tariq