Приховати постійне сповіщення для фонових програм і накладень в Android O

Посібник із приховування постійного сповіщення в Android O, яке показує, коли працює фонова програма або коли відображається накладання.

Оновлення 25.08.17: цей посібник уже застарів, оскільки Google виправив метод, який ми використовуємо, щоб приховати постійне сповіщення у фоновому режимі. Однак ми знайшли інше вирішення цієї проблеми та написали короткий підручник щодо цього ви можете знайти тут.

Android O прагне значно вдосконалити ОС Android, яку ми всі знаємо та любимо. Режим «картинка в картинці» для телефонів, канали сповіщень, інтелектуальний вибір тексту, служби автозаповнення та багато-багато змін під капотом, щоб збільшити час роботи акумулятора, продуктивність і безпеку. Однією з функцій, яка має допомогти користувачам розібратися з проблемами, пов’язаними з часом автономної роботи та продуктивністю, є обмеження фонового процесу. Не вдаючись у подробиці, додатки в Android O більше не можна вивести з ладу через їхні маніфести, зареєстровані неявні широкомовні приймачі, і вони більше не можуть запускати фонові служби без проходження JobScheduler. Якщо програма хоче запустити фонову службу, вона повинна явно повідомити користувачеві, що вона це робить, опублікувавши сповіщення. Однак, коли програма працює у фоновому режимі, Android O тепер, здається, починає працювати 

інший постійне сповіщення про запущені програми. Це також трапляється, коли програма з SYSTEM_ALERT_WINDOW дозвіл (наприклад, популярний Сутінки додаток) зараз відображає накладення.

Постійне сповіщення Android O для фонових і накладених програм. Авторство: Бен Шун \\ 9to5Google

Хоча ці сповіщення згорнуті за замовчуванням, користувач не може їх відхилити або назавжди заблокувати в налаштуваннях. Така поведінка дуже дратує багатьох користувачів, і я щиро сподіваюся, що Google дасть нам можливість вимкнути це сповіщення в остаточному випуску Android O/Android 8.0. Однак, якщо вони цього не зроблять, там є все ще спосіб назавжди приховати постійне сповіщення про фонові програми. Я покажу, як це зробити, у покроковому посібнику, а потім поясню, як це працює, а також важливі застереження.


Вимоги:

  • Android O
  1. Установіть USB-драйвери для конкретного телефону, якщо ви використовуєте Windows (їх можна знайти тут).
  2. Завантажити Двійковий файл ADB для вашої конкретної операційної системи (вікна, Мак, Linux). Ці посилання завжди вказуватимуть на останню версію двійкового файлу, тому вам не доведеться нишпорити по мережі в пошуках останньої версії.
  3. Розпакуйте вміст завантаженого ZIP-файлу в легкодоступну папку на вашому комп’ютері (наприклад, у папку «Завантаження»).
  4. Перейдіть у програму «Налаштування» на телефоні та торкніться опції «Про телефон».
  5. Знайдіть номер збірки та торкніться його 7 разів, щоб увімкнути режим розробника. Після ввімкнення ви побачите спливаюче вікно.
  6. Поверніться до головного меню налаштувань і ввійдіть у параметри розробника, щоб увімкнути режим налагодження USB.
  7. Підключіть телефон до комп’ютера та проведіть пальцем вниз по панелі сповіщень, щоб змінити режим USB із «лише зарядки» на режим «передача файлів (MTP)». Це може не знадобитися для вашого телефону.
  8. На комп’ютері перейдіть до каталогу, у який ви роздобули двійковий файл ADB.
  9. Запустіть командний рядок/термінал у цьому каталозі ADB. Для користувачів Windows це можна зробити, натиснувши Shift+клацнувши правою кнопкою миші, а потім вибравши опцію «відкрити командний рядок тут».
  10. У середовищі командного рядка або терміналу введіть таку команду: adb devices
  11. Це запустить демон ADB. Якщо ви вперше запускаєте ADB, ви також побачите підказку на своєму телефоні з проханням авторизувати з’єднання.
  12. Тепер повторно запустіть команду adb devices із кроку 10, і командний рядок/термінал надрукує серійний номер вашого пристрою. Якщо так, ви готові рухатися далі. Якщо ні, драйвери USB, ймовірно, не встановлено належним чином.
  13. Поверніться до командного рядка та введіть таку команду: adb shell
  14. Тепер виконайте таку команду: cmd appops set android POST_NOTIFICATION ignore
  15. Ви не отримаєте повідомлення про успіх чи щось подібне, але якщо ви не бачите помилки, це мало працювати. Тепер просто перезавантажте телефон!

    Так, я розумію, що це зображення екрана телефону, а не скріншоти. Я сам не маю пристрою, сумісного з Android O, тому я попросив TK надіслати мені зображення.

  16. Якщо ви хочете скасувати цю команду, введіть це в командний рядок: cmd appops set android POST_NOTIFICATION allow

Як це працює

Використовуючи прихований інтерфейс командного рядка для App Ops, системи керування дозволами користувача Android, ми можемо обмежити дозвіл POST_NOTIFICATION з пакета «android». (Примітка: ми встановлюємо для нього значення «ігнорувати», а не «заборонити», оскільки «заборонити» може спричинити деякі помилки.) Я знайшов цей дозвіл, переглянувши відповідний вихідний код для AppOpsManager, у якому перераховано всі можливі дозволи, які можна надати/скасувати, багато з яких недоступні в налаштуваннях Android. Пакет «android» насправді відноситься до «системи Android» AKA framework-res.apk, яка відповідає за постійне сповіщення, якого ми намагаємося позбутися.

Фактично скасувавши дозвіл системи Android POST_NOTIFICATION, вона більше не може показувати сповіщення! Звучить досить просто, чи не так? На жаль, слід знати про одне застереження. «Система Android» відповідає не лише за це сповіщення, тому будь-які інші сповіщення, які вона може опублікувати, більше не відображатимуться. Це може включати сповіщення про режим USB (яке все ще можна змінити за допомогою параметрів у параметрах розробника), а також деякі інші речі.

Хоча це досить рішучий захід з нашого боку, наразі це єдиний спосіб приховати це сповіщення від рутування вашого телефону та модифікації самого фреймворку, що, очевидно, небагато користувачів хочуть або можуть зробити. Я щиро сподіваюся, що Google запропонує спосіб приховати це сповіщення в майбутньому випуску Android O або, навіть краще, повністю видалити це сповіщення. Зрозуміло, що Google хоче покращити взаємодію з користувачем, повідомляючи користувачів, коли програма працює у фоновому режимі користувач може не знати, але метод, який вони вибрали, дратує тих із нас, хто знає, що стосується кожної програми, яку ми використовуючи.