Je fais une notification de barre d'état dans mon application Android qui est déclenchée par c2dm. Je ne veux pas afficher la notification si l'application est en cours d'exécution. Comment déterminez-vous si l'application est en cours d'exécution et est au premier plan?
Réponses
Trop de publicités? Alternativement, vous pouvez vérifier avec la méthode ActivityManager
quelles tâches sont exécutées par la méthode getRunningTasks
. Puis vérifiez avec la première tâche (tâche au premier plan) dans la liste des tâches renvoyée, si c'est votre tâche.
Voici l'exemple de code:
public Notification buildNotification(String arg0, Map<String, String> arg1) {
ActivityManager activityManager = (ActivityManager) appContext.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager
.getRunningTasks(Integer.MAX_VALUE);
boolean isActivityFound = false;
if (services.get(0).topActivity.getPackageName().toString()
.equalsIgnoreCase(appContext.getPackageName().toString())) {
isActivityFound = true;
}
if (isActivityFound) {
return null;
} else {
// write your code to build a notification.
// return the notification you built here
}
}
Créez une variable globale telle que private boolean mIsInForegroundMode;
et affectez une valeur false
à onPause()
et une valeur true
à onResume()
.
Exemple de code:
private boolean mIsInForegroundMode;
@Override
protected void onPause() {
super.onPause();
mIsInForegroundMode = false;
}
@Override
protected void onResume() {
super.onResume();
mIsInForegroundMode = true;
}
// Some function.
public boolean isInForeground() {
return mIsInForegroundMode;
}
Légèrement nettoyé version de Gadenkan de la solution. Le mettre n'importe quelle Activité, ou peut-être une classe de base pour toutes vos Activités.
protected boolean isRunningInForeground() {
ActivityManager manager =
(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1);
if (tasks.isEmpty()) {
return false;
}
String topActivityName = tasks.get(0).topActivity.getPackageName();
return topActivityName.equalsIgnoreCase(getPackageName());
}
Pour être en mesure d'appeler getRunningTasks()
, vous avez besoin de cette en AndroidManifest.xml
:
<uses-permission android:name="android.permission.GET_TASKS"/>
Notez qu' ActivityManager.getRunningTasks()
Javadoc dit:
Remarque: cette méthode est uniquement destiné à des fins de débogage et de la présentation de la tâche la gestion des interfaces utilisateur. Cela ne devrait jamais être utilisé pour de la logique de base dans une application, comme décider entre les différents comportements en fonction sur les informations trouvées ici. Ces utilisations ne sont pas pris en charge, et susceptible de briser dans l'avenir.
Dans de nombreux cas, vous pouvez probablement trouver une meilleure solution. Par exemple, faire quelque chose en onPause()
et onResume()
, peut-être dans un BaseActivity pour toutes vos Activités.
(Dans notre cas, nous ne voulions pas un hors activité d'alerte pour être lancé si nous ne sommes pas au premier plan, de sorte que dans BaseActivity onPause()
nous avons simplement vous désabonner de la RxJava Subscription
l'écoute de "se déconnecter" du signal.)
Suite à Gadenkan de réponse, j'ai besoin de quelque chose comme ce que je pourrais dire si mon application n'est pas en cours d'exécution dans le premier plan, mais j'ai besoin de quelque chose qui est d'application large et de ne pas exiger de moi de réglage/désactivation de drapeaux tout au long de ma demande.
Gadenkan du code assez bien frappé le clou sur la tête, mais il n'était pas dans mon propre style et a estimé qu'il pourrait être plus propre, donc, dans mon application ses résumés à cette situation.
if (!context.getPackageName().equalsIgnoreCase(((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningTasks(1).get(0).topActivity.getPackageName()))
{
// App is not in the foreground
}
(Note: Vous pouvez simplement supprimer la ! si vous voulez le vérifier à travailler dans l'autre sens)
Bien que, avec cette approche, vous avez besoin de l' GET_TASKS
autorisation.