web-dev-qa-db-de.com

Überprüfen Sie, ob die Aktivität vom Dienst ausgeführt wird

Wie kann eine Service prüfen, ob eine ihrer Anwendungen Activity im Vordergrund ausgeführt wird?

36
Taranfx

Verwenden Sie die unten stehende Methode mit Ihrem Paketnamen. Es wird true zurückgegeben, wenn eine Ihrer Aktivitäten im Vordergrund steht.

public boolean isForeground(String myPackage) {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1); 
    ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
    return componentInfo.getPackageName().equals(myPackage);
}

Update:

Erlaubnis hinzufügen:

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

Von Lollipop ausgehend ist getRunningTasks veraltet:

 * <p><b>Note: this method is only intended for debugging and presenting
 * task management user interfaces</b>.  This should never be used for
 * core logic in an application, such as deciding between different
 * behaviors based on the information found here.</p>
 *
 * @deprecated As of {@link Android.os.Build.VERSION_CODES#Lollipop}, this method
 * is no longer available to third party applications.

Eine Möglichkeit, dies zu tun, besteht darin, beim Start der App an den Dienst zu binden. Dann: 1. Wenn Sie überprüfen müssen, ob eine Aktivität der App ausgeführt wird, können Sie eine Basisklasse für Ihre Aktivitäten erstellen und onPause und onResume überschreiben. Rufen Sie in onPause eine Servicemethode auf, um sie wissen zu lassen, dass sie sich im Hintergrund befindet. Rufen Sie in onResume eine Servicemethode auf, um sie wissen zu lassen, dass sie sich im Vordergrund befindet .. 2. Wenn Sie dies nur für bestimmte Aktivitäten tun müssen, überschreiben Sie einfach onResume und onPause für diese Aktivitäten oder erstellen Sie eine Basisaktivität für diese Aktivitäten.

5
Comtaler

Verwenden Sie SharedPreferences, um den Status Ihrer App in onResume, onPause usw. zu speichern.

wie so:

 @Override
public void onPause() {
    super.onPause();
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit();
}

@Override
public void onDestroy() {
    super.onDestroy();
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit();
}

@Override
public void onResume() {
    super.onResume();
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", true).commit();
}

und dann im dienst:

if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("isActive", false)) {
            return;
}

ich habe sowohl onPause als auch onDestroy verwendet, weil es manchmal direkt zu onDestroy springt :) es ist im Grunde alles Voodoo

trotzdem, hoffe, das hilft jemandem

5
eiran

Bei den meisten der obigen Antworten liegt ein Fehler vor, wenn Ihre Aktivität über eine Funktion verfügt, die eine andere Aktivität auslöst, z. eine E-Mail senden 

enter image description here

topActivity gibt nicht den Namen Ihres Pakets zurück, sondern den Paketnamen der Android-Aktivitätsauswahl.

Daher ist es besser, nach baseActivity anstelle von topActivity zu suchen.

public boolean isMainActivityRunning(String packageName) {
    ActivityManager activityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(Integer.MAX_VALUE); 

    for (int i = 0; i < tasksInfo.size(); i++) {
        if (tasksInfo.get(i).baseActivity.getPackageName().toString().equals(packageName)
            return true;
    }

    return false;
} 
3
ForceMagic

Ich denke, Sie können GetRunninTasks auf Android laden und mit Ihrem Paketnamen überprüfen, ob die Task ausgeführt wird oder nicht.

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