Путаница с goAsync - процесс BroadcastReceiver не прерывается в течение 10 секунд - PullRequest
0 голосов
/ 17 февраля 2019

Согласно документации, даже после вызова goAsync метод BroadcastReceiver onReceive должен завершиться через 10 секунд, в противном случае система может завершить процесс.

У меня естьпроверил его на эмуляторе для приложения, работающего в фоновом режиме, и ни с, ни без goAsync фоновый поток был убит где-то около 10 секунд.Это на самом деле до нескольких минут для обоих.Единственный случай, когда он действительно уничтожается через 10 секунд, - это когда я добавляю флаг Intent.FLAG_RECEIVER_FOREGROUND к намерению, которое запускает трансляцию.

Это потому, что мое устройство не имеет ограничений памяти?

1 Ответ

0 голосов
/ 11 апреля 2019

Я думаю, вы не поняли, как BR работает .Особенно эта часть имеет решающее значение

. По этой причине вам не следует запускать длительные фоновые потоки из широковещательного приемника.После onReceive () система может в любой момент завершить процесс, чтобы освободить память, и при этом она прерывает порожденный поток, запущенный в процессе.Чтобы избежать этого, вы должны либо вызвать goAsync () (если вам нужно немного больше времени для обработки широковещательной передачи в фоновом потоке), либо запланировать JobService от получателя с помощью JobScheduler, чтобы система знала, что процесс продолжает выполнять активныеРабота.Для получения дополнительной информации см. Процессы и жизненный цикл приложения.

Таким образом, goAsync из BroadcastReceiver предназначен для продления срока службы БР в целом, а не сам onReceive - onReceive все еще работаетна основной поток и применяется ограничение ANR.Но с

«Нормальный BR» считается бесполезным после возврата из onReceive, согласно справочной документации:

goAsync () Это может быть вызвано приложением в onReceive (Context(Намерение), чтобы позволить ему сохранять трансляцию активной после возврата из этой функции.

С goAsync вы можете запустить некоторое фоновое задание / поток на «некоторое время», потому что это не «нормальный BR»- теперь это "BR with goAsync".

Это потому, что мое устройство не ограничено в памяти?

И да, я бы не стал доверять эмулятору в этом отношении.

...