Я думаю, вы не поняли, как BR работает .Особенно эта часть имеет решающее значение
. По этой причине вам не следует запускать длительные фоновые потоки из широковещательного приемника.После onReceive () система может в любой момент завершить процесс, чтобы освободить память, и при этом она прерывает порожденный поток, запущенный в процессе.Чтобы избежать этого, вы должны либо вызвать goAsync () (если вам нужно немного больше времени для обработки широковещательной передачи в фоновом потоке), либо запланировать JobService от получателя с помощью JobScheduler, чтобы система знала, что процесс продолжает выполнять активныеРабота.Для получения дополнительной информации см. Процессы и жизненный цикл приложения.
Таким образом, goAsync
из BroadcastReceiver
предназначен для продления срока службы БР в целом, а не сам onReceive
- onReceive
все еще работаетна основной поток и применяется ограничение ANR.Но с
«Нормальный BR» считается бесполезным после возврата из onReceive
, согласно справочной документации:
goAsync () Это может быть вызвано приложением в onReceive (Context(Намерение), чтобы позволить ему сохранять трансляцию активной после возврата из этой функции.
С goAsync
вы можете запустить некоторое фоновое задание / поток на «некоторое время», потому что это не «нормальный BR»- теперь это "BR with goAsync".
Это потому, что мое устройство не ограничено в памяти?
И да, я бы не стал доверять эмулятору в этом отношении.