it-swarm.com.ru

Android Oreo постоянное уведомление "Приложение работает в фоновом режиме"

Я разработчик приложений для Android и разрабатываю приложение для мгновенных сообщений. Приложение имеет проблему с уведомлением в системе Android Oreo, которая показывает постоянное уведомление «Приложение работает в фоновом режиме» и не может быть очищено, и это нормально в системе до Android Oreo.

Скриншот: телефон показывает постоянное уведомление Приложение работает в фоновом режиме

Я нахожу некоторые обсуждения, такие как Справочный форум Nexus по этому вопросу , но это не работает в настройках моего телефона.

Я хочу знать, как скрыть это уведомление программно, и приложение также может получать сообщения мгновенно, потому что это приложение для мгновенных сообщений.

Любая помощь очень ценится.

6
Smiles

Приложение имеет проблему с уведомлением в системе Android Oreo, которая показывает постоянное уведомление «Приложение работает в фоновом режиме» и не может быть очищено, и это нормально в системе до Android Oreo.

Вы использовали startForeground() с минимальной важностью Notification.

Я хочу знать, как скрыть это уведомление программно

Используйте startForeground() с Notification, значение которого выше минимального. Или не используйте startForeground().

Я нахожу некоторые приложения для установки сообщений, такие как WeChat, у Facebook нет этой проблемы на Android Oreo

Предположительно, они не пользуются приоритетными услугами. Например, они могут использовать Firebase Cloud Messaging (FCM).

4
CommonsWare

Однако прежде чем говорить о том, как от него избавиться, давайте сначала поговорим о том, почему он существует.

По сути, в предыдущих версиях Android не было реального способа узнать, работает ли приложение в фоновом режиме и выполняет ли он кучу вещей, которые он не должен делать. В большинстве сценариев эти плохо себя ведущие приложения могут нанести ущерб батарее, если система не будет активна - это называется «пробуждением покоя». С точки зрения неспециалистов, система не дает системе спать. Это плохо.

С Oreo Google призывает разработчиков, которые позволяют своим приложениям делать такие вещи с новым уведомлением. По сути, если приложение работает в фоновом режиме и расходует заряд батареи, это новое уведомление сообщит вам.

ПРИМЕЧАНИЕ. Существует несколько законных сценариев, в которых приложение будет непрерывно работать в фоновом режиме, например, при запуске службы VPN. Однако зачастую приложения работают в фоновом режиме неоправданно.

Стоит отметить, что удаление уведомления не решает проблему. Период. Существует причина, по которой это уведомление существует, и избавление от него не поможет решить основную проблему. Вам нужно либо изменить параметр в приложении, либо полностью удалить его.

Если вы понимаете это и по-прежнему хотите удалить его, давайте сделаем это ........ Поскольку это относительно важный системный параметр, в самом Oreo нет способа удалить его. В этом есть смысл.

Но, как и в большинстве случаев, сообщество разработчиков нашло способ удалить его, и разработчик iboalali выпустил приложение для этого. На самом деле его просто называют «Скрыть», работающим в фоновом режиме «Уведомление», что примерно так же просто, как название приложения. Идите и дайте ему установить.

Без рута невозможно фактически запретить системе Android отображать постоянное уведомление «приложение работает в фоновом режиме» в Android 8.0 Oreo. Глядя на исходный код ForegroundServiceController, его реализацию и ForegroundServiceDialog, на самом деле ничего не раскрывается, чем мы можем воспользоваться. Программно ничего не найдено до сих пор.

Вот сообщение в блоге, которое может помочь вам

2
Supradip.M

Во-первых, у вас должна быть реализация NotificationListenerService . Во-вторых, в этом сервисе (после обратного вызова onListenerConnected) проверьте активные текущие уведомления с packageName под названием «Android». И проверьте в этом уведомлении заголовок имя вашего приложения или текст значение «Приложение работает в фоновом режиме» и отложите его. 

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