Можно ли поместить уведомление службы переднего плана в канал уведомлений с IMPORTANCE_MIN?

В настоящее время я работаю над переводом приложения на Android O и работаю над каналами уведомлений.

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

Однако, когда я делаю это и помещаю свое приложение в фоновый режим (с кнопками «Домой» или «Назад»), я получаю уведомление системы Android, сообщающее мне, что мое приложение работает в фоновом режиме, например:

«Уведомление

Если я изменю свой канал и заставлю его использовать IMPORTANCE_LOW, проблема исчезнет, ​​однако уведомление станет более заметным.

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

Мой второй вопрос: до O, если вы установите приоритет своего уведомления на PRIORITY_MIN, можете ли вы связать это уведомление со службой, чтобы сделать ее службой переднего плана, или это всегда было запрещено?

Изменить: Подтверждено, что система Android показывает уведомление для каналов с важностью IMPORTANCE_MIN (спасибо, M66B), поэтому остается вопрос: почему? Кто-нибудь знает причину этого или может найти какую-либо документацию в любом месте? Возможно, это ошибка, о которой следует сообщить трекеру?


person Anax    schedule 03.08.2017    source источник
comment
Использование приоритета уведомлений PRIORITY_MIN для уведомлений службы переднего плана работало нормально до Android O, а также на Android O, по моему опыту.   -  person M66B    schedule 03.08.2017
comment
Вы имеете в виду, что на Android O, если вы все еще не ориентируетесь на уровень API 26? Потому что приоритеты устарели, начиная с уровня API 26, и вместо этого вам нужно создать каналы уведомлений с важностью, чтобы упорядочить свои уведомления.   -  person Anax    schedule 04.08.2017
comment
Приоритет уведомлений устарел на уровне API 26, но новым является «важность» канала уведомлений, поэтому вы все равно можете добиться того же. См. здесь: developer.android.com/reference/android/ приложение/   -  person M66B    schedule 04.08.2017
comment
Эй, да, я примерно так и сказал. Итак, вы попытались создать канал уведомлений с IMPORTANCE_MIN, и вы создали уведомление, которое будет отправлено в этот канал, а затем привязали его к службе, чтобы сделать ее службой переднего плана, и когда ваше приложение находится в фоновом режиме (ваш пользовательский интерфейс не включен экран), уведомление находится в тени уведомлений внизу, и вы НЕ получаете уведомление от системы Android, скриншот которого я разместил?   -  person Anax    schedule 04.08.2017
comment
@ M66B M66B Пожалуйста, воздержитесь от публикации комментариев о решениях, если вы на самом деле не проверили их самостоятельно (или прямо заявите, что вы этого не делали). Кроме того, всегда убедитесь, что вы внимательно прочитали вопрос. См.: stackoverflow.com/help/how-to-answer Здесь вопрос касается ориентации на Android O с помощью API 26. , проблема, с которой в ближайшие месяцы столкнется все больше и больше людей.   -  person milosmns    schedule 04.08.2017
comment
@milosmns, как сказано в моем первом комментарии по моему опыту, а это значит, что я сам успешно применяю предложенное решение. С чего ты взял, что я этого не делал? (просто для улучшения моих комментариев/ответов)   -  person M66B    schedule 04.08.2017
comment
@M66B M66B Это скорее общий комментарий, действительный для всех сообщений. ОП искал ответ для API 26, это то, о чем я в основном имел в виду, так как я сам ищу такое же решение.   -  person milosmns    schedule 04.08.2017
comment
@Anax, если вы ищете решение для удаления системного уведомления Android: приложение не может этого сделать. Однако есть способ удалить его с помощью adb, см. здесь: xda -developers.com/hide-persistent-notification-android-o   -  person M66B    schedule 04.08.2017
comment
@milosmns хорошо, я понимаю. Обратите внимание, что я сознательно решил прокомментировать вопрос, а не отвечать.   -  person M66B    schedule 04.08.2017
comment
@ M66B Принято к сведению, надеюсь, мы скоро получим ответ на этот вопрос.   -  person milosmns    schedule 04.08.2017
comment
@ M66B Привет. Это уведомление не должно отображаться, если у вас запущена служба переднего плана, верно? Тот факт, что он появляется только тогда, когда уведомление находится в IMPORTANCE_MIN, заставил меня подумать, что вы не можете запускать уведомления службы переднего плана в каналах с такой важностью. Как я уже сказал, когда я повышаю важность канала до IMPORTANCE_LOW, системное уведомление Android не появляется. Вот почему я задаю вам очень конкретный вопрос, а ваши ответы обычно более общие. Наверное поэтому и милосмны заступились. Можешь еще раз прочитать мой последний вопрос?   -  person Anax    schedule 04.08.2017
comment
@ M66B Кроме того, насколько я понимаю, вы получаете уведомление от Android о том, что ваша служба работает в фоновом режиме. Пробовали ли вы повысить важность своего канала до IMPORTANCE_LOW? Android не публикует уведомление о моем приложении в этой ситуации. Не могли бы вы подтвердить то же самое? Спасибо.   -  person Anax    schedule 04.08.2017
comment
@Anax: при низкой важности отображается уведомление, связанное со службой переднего плана, включая ее значок в строке состояния (последнее не отображается при минимальной важности), однако системное уведомление Android больше не отображает службу переднего плана (это по-прежнему показывает другие службы переднего плана других приложений). Подводя итог: Android всегда будет отображать уведомление о запущенных службах переднего плана, а минимальная/низкая важность изменяет способ и место их отображения, но полностью избавиться от них невозможно. Протестировано на Nexus 5X с DP4.   -  person M66B    schedule 04.08.2017
comment
@Anax имейте в виду, что вам нужно удалить приложение, чтобы воссоздать канал уведомлений с другими атрибутами.   -  person M66B    schedule 04.08.2017
comment
@ M66B Спасибо за помощь. Я отредактировал вопрос, чтобы отразить и ваши выводы. Меня очень интересует, является ли это предполагаемым поведением, и если да, то почему. На мой взгляд, уведомления службы переднего плана довольно надоедливы, когда у них есть постоянный значок в строке состояния.   -  person Anax    schedule 04.08.2017
comment
так что вопрос, который остается теперь, почему? -- вопросы вида почему Разработчик X принял Решение Y? не подходят для переполнения стека. Единственная сторона, которая может дать точный ответ, — это Разработчик X, который вряд ли увидит вопрос. Возможно, это ошибка, о которой следует сообщить трекеру? -- Я в этом сомневаюсь. В конце концов, они отображают выделенный системой Notification, когда у вас есть IMPORTANCE_MIN. Кажется довольно маловероятным, что они случайно добавили его.   -  person CommonsWare    schedule 04.08.2017
comment
Что касается моих догадок, почему?, пользователи очень громко высказали свое мнение о том, что они ненавидят вещи, работающие за их спинами. Например, во временном интервале Android 4.x в Android была ошибка, из-за которой startForeground() с ошибочным Notification (например, без значка) приводило к важности переднего плана, но не Notification. Android 4.4 (?) изменил поведение, чтобы восстановить такой сломанный Notification, чтобы пользователи знали о службе переднего плана. Затем пользователи ругали разработчиков за наличие таких сервисов, в меньшей степени за загромождение строки состояния.   -  person CommonsWare    schedule 04.08.2017
comment
@CommonsWare Спасибо за ответы. Жаль, что это нигде не задокументировано. Думаю, я просто создам отдельный канал для текущего уведомления, а затем ничего не буду публиковать в нем (или, может быть, даже удалю его (хотя я действительно не хочу иметь удаленные каналы)), когда мы перейдем от службы переднего плана. В любом случае, я думаю, на этом ответ заканчивается. Спасибо еще раз.   -  person Anax    schedule 04.08.2017


Ответы (1)


Это поведение теперь задокументировано: https://developer.android.com/reference/android/app/NotificationManager.html#IMPORTANCE_MIN

Минимальная важность уведомлений: отображается только в тени, ниже сгиба. Это не следует использовать с Service.startForeground, поскольку служба переднего плана должна быть чем-то, о чем заботится пользователь, поэтому не имеет семантического смысла помечать ее уведомление как минимальное значение. Если вы сделаете это, начиная с версии Android O, система покажет уведомление с более высоким приоритетом о том, что ваше приложение работает в фоновом режиме.

А также здесь: https://material.io/guidelines/patterns/notifications.html#notifications-settings

В Android O уровень важности канала по умолчанию для уведомлений службы переднего плана должен быть не ниже IMPORTANCE_LOW, чтобы он отображал значок в строке состояния.

Каналы, использующие менее заметный уровень IMPORTANCE_MIN, вызовут дополнительное уведомление от Android на уровне IMPORTANCE_LOW о том, что приложение расходует заряд батареи.

Побочное примечание: это настоящая проблема для нас, так как до O мы использовали динамическое переключение между PRIORITY_DEFAULT и PRIORITY_MIN, когда в нашем уведомлении переднего плана не было интересной информации для представления. С каналами мы больше не можем динамически изменять ВАЖНОСТЬ, и нам пришлось удалить эту функцию.

person Josh    schedule 12.01.2018
comment
Большое спасибо! У нас была очень похожая фича, тоже пришлось ее убрать. - person Anax; 12.01.2018
comment
я предполагаю, что ответ заключается в том, чтобы использовать отдельный канал для информации с более высоким приоритетом и проинструктировать пользователя о том, как вручную уменьшить видимость основного уведомления. - person j__m; 23.01.2018