web-dev-qa-db-fra.com

Vérifier si Activity est en cours d'exécution depuis le service

Comment une Service peut-elle vérifier si l'une de ses applications Activity s'exécute en avant-plan?

36
Taranfx

Utilisez la méthode ci-dessous avec votre nom de package. Il reviendra vrai si l'une de vos activités est au premier plan.

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

Mettre à jour:

Ajouter une permission:

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

À partir de Lollipop, getRunningTasks est obsolète:

 * <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.

Une façon de faire est de se lier au service au démarrage de l'application. Puis: 1. Si vous devez vérifier qu'une activité de l'application est en cours d'exécution, vous pouvez créer une classe de base pour vos activités et remplacer onPause et onResume. Dans onPause, appelez une méthode de service pour lui faire savoir que c'est en arrière-plan. Dans onResume, appelez une méthode de service pour lui faire savoir qu'elle se trouve au premier plan . 2. Si vous ne devez effectuer cette opération que pour une activité spécifique, remplacez simplement onResume et onPause pour ces activités ou créez une activité de base pour ces activités.

5
Comtaler

Utilisez SharedPreferences pour enregistrer le statut de votre application dans onResume, onPause, etc.

ainsi:

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

puis au service:

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

j'ai utilisé à la fois onPause et onDestroy car parfois il saute directement à onDestroy :) c'est fondamentalement tout vaudou

de toute façon, espoir qui aide quelqu'un

5
eiran

Il existe un défaut dans la plupart des réponses ci-dessus, si votre activité comporte une fonctionnalité qui en déclenche une autre, par exemple. envoyer un email 

enter image description here

la topActivity ne renverra pas le nom de votre package mais le nom du package de sélecteur d'activité Android.

Ainsi, il est préférable de vérifier la baseActivity au lieu de la topActivity.

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

Je pense que vous pouvez obtenirRunninTasks sur Android et vérifier avec votre nom de fichier si la tâche est en cours d'exécution ou non.

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