Сейчас Android 15 активно появляется у пользователей. И, как мне кажется, одна его особенность для многих могла остаться незамеченной и даже в документации в описании behavior changes она в конце, а в Features and Changes list и вовсе не упомянута.

Конкретно эта:

Background network access restrictions
Background network access restrictions

О чем речь: если приложение в фоне, то теперь не получится сделать сетевой запрос вне WorkManager или Foreground Service, иначе запрос упадет с UnknownHostException. Я проверил на своем устройстве с недавно прилетевшим Android 15 и выставленным targetSdk = 35 и это действительно так.

До сих пор можно было оправлять запросы (например метрики) в фоновом потоке до тех пор, пока приложение не будет прибито системой.

Вместо конкретного события жизненного цикла, когда это ограничение наступает, в описании фигурирует “valid process lifecycle. Я проверил в демо-приложении, в какой момент запросы начнут падать. Результаты внезапные: строгой связи с событиями ЖЦ не обнаружил. Запросы начинают обрезаться примерно через 5 сек. после вызова Activity.onStop() при сворачивании Activity. Чуть раньше - запросы еще работают.

UnknownHostException при запросе в фоне
UnknownHostException при запросе в фоне

Вопрос довольно срочный ‑ поднимать target API level до Android 15 нужно будет уже в этом году. Google пока не обозначил дату, но, судя по предыдущим годам, это август или ноябрь 2025. На этом сайте написано про август.

P. S. Думаю, изменение правильное: нечего грузить девайс и сеть, если приложение сейчас не используется. Плохо, что оно вводится так поздно, когда уже написаны тысячи приложений, которые раньше это не учитывали и которые теперь придется дорабатывать.

P. S.2 Да, редкий случай, когда код намеренно написан так, чтобы выполнялись сетевые запросы в фоне, пока пользователь свернул приложение. Но во многих проектах могут быть места, где запросы исполняются без привязки к ЖЦ отложенно или периодически; по задумке или по ошибке. Также подобные места могут быть в сторонних подключенных SDK. Вы можете проверить это, например, с помощью Android Studio: View → Tool Windows → App Inspection → Network Inspector

Комментарии (23)


  1. gonzazoid
    26.06.2025 16:15

    Хм. То есть слушать музыку с фоновым приложением онлайн нельзя будет не только на ютубе но и вообще нигде?


    1. Aquahawk
      26.06.2025 16:15

      revanced решает эту проблему


    1. dartraiden
      26.06.2025 16:15

      Можно, если разработчик приложения реализовал это как полагается. Ниже в комментах есть пример того, как надо.


    1. Zulu0
      26.06.2025 16:15

      Думаешь vk проплатила гуглу за эту правку?


      1. gonzazoid
        26.06.2025 16:15

        Да не, я с точки зрения пользователя размышлял. У меня небольшой проект есть, в профиле можно посмотреть статьи, там у пользователей один из самых частых запросов сделать ютуб играющим на фоне. Вот я от этой новости и подумал - стоит ли заморачиваться и разматывать или сразу не шмогла сделать. Но, как уже подсказали, паниковать рано, продолжаем работать.


        1. AndyLem
          26.06.2025 16:15

          Ютюб прекрасно играет на фоне


          1. gonzazoid
            26.06.2025 16:15

            На мобиле в браузере и без премиума?


            1. qeeveex
              26.06.2025 16:15

              Да. В firefox все работает. Если есть какие-то проблемы, то там же есть плагин для ютуба.


              1. gonzazoid
                26.06.2025 16:15

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


  1. Oeaoo
    26.06.2025 16:15

    P. S. Думаю, изменение правильное: нечего грузить девайс и сеть, если приложение сейчас не используется.

    Это да, но UnknownHostException - это странное решение. Поленились кинуть специфический ексепшн, теперь клиентский код не может отличить этот кейс от остальных сетевых проблем. Ну, не знаю.


    1. mmarashan Автор
      26.06.2025 16:15

      Соглашусь. Предположу, что могли сделать для обратной совместимости, чтобы не посыпались приложения, в которых обработаны конкретные сетевые Exception-ы, а иначе - краш


      1. Oeaoo
        26.06.2025 16:15

        Ну решается по идее просто - `public class SomeNewNetworkException extends IOException {...}` и все фоновые обработчики выхватят `IOException` что вполне себе нормально. Просто в таком случае разрабы увидят в логах именно `SomeNewNetworkException` и подправят реализацию. А с их решением проблема мимикрирует под другие, что как-бы так себе дизайн.


    1. lsillarionov
      26.06.2025 16:15

      Там не UnknownHostException, а "Typically, an UnknownHostException or other socket-related IOException".
      Сеть, судя по всему, просто на другом уровне отключается.


      1. Oeaoo
        26.06.2025 16:15

        Ну да, но все равно путает. Сеть, хост, стек ведь может быть в порядке. Просто "нельзя".


    1. domix32
      26.06.2025 16:15

      Линуса на них нет.


  1. durka
    26.06.2025 16:15

    Вообще-то если ваше приложение должно работать c сетью в фоне, оно должно это делать не через активность, а с помощью службы.
    Для чего её нужно зарегистрировать в манифесте:
    <service android:name=".NetworkService" android:exported="false" android:enabled="true" android:foregroundServiceType="dataSync" />

    protected void StartService() { Intent serviceIntent = new Intent(this, NetworkService.class); // Запуск службы в фоновом режиме, startForegroundService(serviceIntent); } protected void BindService() { // Создание Intent для привязки службы Intent serviceIntent = new Intent(this, NetworkService.class); // Привязка к NetworkService Log.i(TAG, "try bindService..."); boolean bindResult = bindService(serviceIntent, m_Connection, Context.BIND_AUTO_CREATE); Log.i(TAG, "bindService result: " + bindResult); }


    1. oldzoomer
      26.06.2025 16:15

      Собственно, в вебоси (LG webOS) давно именно так. И YouTube, и Кинопоиск, и другие сервисы, где есть функция "включить видео со смартфона" именно так и работают.


    1. mmarashan Автор
      26.06.2025 16:15

      Никто не утверждал, что с сетью нужно работать "через активность". Думаю всем с мало-мальским опытом понятно как правильно. Тут речь о том, что есть смысл проверить места, где запросы в фоне летят почему-то вне WorkManager или Foreground Service и поправить


  1. aamonster
    26.06.2025 16:15

    Т.е. приложения, которые раньше могли работать нестабильно, перестанут работать совсем (и будут починены автором, если повезёт?)


  1. pavel_shabalin
    26.06.2025 16:15

    К комментариям выше

    При беглом взгляде кажется, что:

    UnknownHostException вместо SomeNewNetworkException - это просто сайд-эффект более глубокого ограничения Activity для работы с сетью.


  1. Jack007
    26.06.2025 16:15

    После обновления до 15 Android смартфон перестал в фоне воспроизводить Интернет радио через ~20 сек после гашения экрана. Проверено на нескольких приложениях, тема активно обсуждалась пользователями на 4PDA - решения так и не найдено, кроме отката на 14 -13 Android...


    1. domix32
      26.06.2025 16:15

      У меня по тому же принципу уведомления из мессенджеров перестают приходить. Тебе вроде написали, но узнаешь ты это только включив дисплей на посмотреть время. Странно это всё.


      1. Jack007
        26.06.2025 16:15

        Не, подобная фишка у меня работает. Может - потому, что сообщения дублируются на смарт-часы Huawey, соответствующее приложение которых работает на телефоне. Но почему я радио ни на одном приложении теперь не могу слушать в дороге, как раньше???