web-dev-qa-db-fra.com

Notification persistante Android Oreo "L'application est exécutée en arrière-plan"

Je suis un développeur d'applications Android et développe une application de messagerie instantanée. L'application présente un problème de notification sur le système Android Oreo, qui indique que la notification persistante "L'application est exécutée en arrière-plan" et qu'elle ne peut pas être effacée. Elle est correcte sur le système avant Android Oreo.

Capture d'écran: le téléphone indique qu'une notification persistante est exécutée en arrière-plan

Je trouve des discussions, telles que Forum d'aide Nexus sur cette question , mais cela ne fonctionne pas dans les paramètres de mon téléphone.

Je veux savoir comment masquer cette notification par programme et l'application peut également recevoir un message instantanément car il s'agit d'une application de messagerie instantanée.

Toute aide est très appréciée.

6
Smiles

L'application présente un problème de notification sur le système Android Oreo, qui indique que la notification persistante "L'application est exécutée en arrière-plan" et qu'elle ne peut pas être effacée. Elle est correcte sur le système avant Android Oreo.

Vous avez utilisé startForeground() avec une valeur minimale Notification.

Je veux savoir comment cacher cette notification par programme

Utilisez startForeground() avec une Notification dont l’importance est supérieure au minimum. Ou, n'utilisez pas startForeground().

Je trouve des applications de messagerie installées telles que WeChat, Facebook ne rencontre pas ce problème sous Android Oreo

Ils n'utilisent probablement pas les services de premier plan. Par exemple, ils utilisent peut-être Firebase Cloud Messaging (FCM).

4
CommonsWare

Avant que nous discutions de la façon de nous en débarrasser, parlons maintenant de la raison pour laquelle elle existe.

Dans les versions précédentes d’Android, il n’existait en réalité aucun moyen de savoir si une application fonctionnait en arrière-plan et effectuait un tas de choses qu’elle n’était pas supposée faire. Dans la plupart des scénarios, ces applications défectueuses causeraient des ravages sur la batterie en maintenant le système en veille - on les appelle des «réveils». En termes simples, cela empêchait le système de dormir. C'est mauvais.

Avec Oreo, Google appelle les développeurs qui laissent leurs applications faire ce genre de choses avec la nouvelle notification. Essentiellement, si une application est en cours d'exécution en arrière-plan et réduit l'autonomie de la batterie, cette nouvelle notification vous le dira.

REMARQUE: il existe quelques scénarios légitimes dans lesquels une application s'exécutera en permanence en arrière-plan, comme le service VPN en cours d'exécution. Cependant, les applications fonctionnent souvent en arrière-plan de manière injustifiable.

Il convient toutefois de noter que la suppression de la notification ne résout pas le problème. Période. Il existe une raison pour laquelle cette notification existe, et son élimination ne fera rien pour résoudre le problème sous-jacent. Vous devrez soit modifier un paramètre dans l'application, soit le désinstaller complètement.

Tant que vous comprenez cela et que vous voulez toujours le supprimer, prenons cette mesure .. Comme il s’agit d’un paramètre système crucial, il n’ya aucun moyen de le supprimer au sein même d’Oreo. Ça a du sens.

Mais comme dans la plupart des cas, la communauté des développeurs a trouvé un moyen de le supprimer et le développeur iboalali a publié une application dans ce but. En fait, il s’appelle simplement «Notification de masquage en arrière-plan», ce qui est aussi simple qu’un nom d’application pourrait l’être. Allez-y et installez-le.

Sans root, il n’ya aucun moyen d’empêcher réellement Android System d’afficher la notification persistante «L’application est exécutée en arrière-plan» dans Android 8.0 Oreo. L'examen du code source de ForegroundServiceController, de son implémentation et de ForegroundServiceDialog ne révèle rien de vraiment exploitable. Par programme, rien n'a été trouvé jusqu'à présent.

Voici un article de blog qui peut vous aider

2
Supradip.M

Tout d'abord, vous devez disposer de NotificationListenerService implementation. Deuxièmement, dans ce service (après le rappel onListenerConnected), vérifiez les notifications actives en cours avec packageName appelé "Android". Et vérifiez le titre - de cette notification est le nom de votre application ou texte la valeur est 'L'application est en cours d'exécution en arrière-plan' et répétez-la. 

public class NLService extends NotificationListenerService {

   @Override
   public void onNotificationRemoved(StatusBarNotification sbn) {}

   @Override
   public void onListenerConnected() {
      super.onListenerConnected();

      checkOngoingNotification();
   }

   @Override
   public void onNotificationPosted(StatusBarNotification sbn){

      if(sbn.isOngoing()) { 

         checkOngoingNotification(); 
         return; 
      }
   }

   private void checkOngoingNotification() {

      StatusBarNotification[] activeNotifications = getActiveNotifications();

      Log.i("NLService", "Active notifications size : " + activeNotifications.length);

      for (StatusBarNotification statusBarNotification : activeNotifications) {

         Log.i("NLService", "notification package  : " + statusBarNotification.getPackageName());
         Log.i("NLService", "notification id       : " + statusBarNotification.getId());
         Log.i("NLService", "notification key      : " + statusBarNotification.getKey());
         Log.i("NLService", "isOngoing             : " + statusBarNotification.isOngoing());
         Log.i("NLService", "isClearable           : " + statusBarNotification.isClearable());
         Log.i("NLService", "groupKey              : " + statusBarNotification.getGroupKey());

         Notification notification = statusBarNotification.getNotification();

         CharSequence title = notification.extras.getCharSequence(Notification.EXTRA_TITLE);
         CharSequence text  = notification.extras.getCharSequence(Notification.EXTRA_TEXT);


         if (title != null && text != null) {

            Log.i("NLService", "title                : " + title);
            Log.i("NLService", "text                 : " + text);


            if (statusBarNotification.getPackageName().equals("Android") &&
                (title.toString().contains("Your App Name") || text.toString().contains("App is running"))) {

                long snoozLong = 60000L * 60L * 24L * 20L;

                this.snoozeNotification(statusBarNotification.getKey(), snoozLong);

                Log.i("NLService", "Snoozed notification  : " + title);
            }
        }
    }
}
0
hsyn_tr