У меня есть приложение, которое запускает определенный «длинный» процесс при открытии или когда устройство загружено.Android - Сервис или IntentService?
Процесс выполняет определенное количество загрузок через диспетчер загрузки, а когда процесс завершается, он отправляет событие вещания в приложение, чтобы захватить некоторые аналитики.
Как я понимаю, всякий раз, когда вызывается событие трансляции, класс Application
запутан (если не в памяти уже).
Application
класс также инициируется, когда пользователь открывает приложение.
На основании этого код для запуска процесса находится внутри onCreate
метода класса Application
. (процесс начинает новый поток оттуда)
Однако, похоже, что «длинный» процесс занимает больше времени жизни приемника вещания для вещания (около 10 секунд?), поэтому процесс приложения убит. Затем через пару секунд после завершения загрузки будет отправлено второе широковещательное сообщение, и приложение снова запустится с вызовом Application.onCreate
с некоторыми нежелательными эффектами.
Ожидается, что процесс должен выполняться одним линейным способом, а не снова звонить onCreate
.
Поскольку этот процесс происходит только один раз, я думал о создании Service
, чтобы дать больше времени приложению, чтобы остаться в живых. Однако процесс зависит от DownloadManager так:
1) Использование IntentService
не будет работать (как я понимаю), потому что процесс все еще убит после возвращения handleIntent
. Процесс создает новые потоки, поэтому его задачи выполняются async, и метод handleIntent
вернется до завершения всего процесса.
2) Должен ли я создать Service
, который является просто «живым» в течение некоторого времени, а затем останавливается после завершения процесса?
3) В качестве дополнительного вопроса, если у меня есть работа Service
, будет ли создаваться экземпляр класса «Application
», пока Служба не будет остановлена?
Вы блокируете метод 'onReceive' вашего BroadcastReceiver более 10 секунд? – waqaslam
@waqaslam no, BroadcastReceiver ничего не делает в отношении этого процесса, процесс управляется из класса Application. – htafoya
Вместо того, чтобы делать это в 'onCreate' приложения, я предлагаю вам создать« IntentService »внутри' onReceive' вашего BroadcastReceiver. Это не будет занимать основной поток пользовательского интерфейса, поскольку IntentService работает в фоновом потоке. Кроме того, (в качестве альтернативы) вы также можете использовать 'JobScheduler', поскольку он поставляется с некоторыми отличными функциями. – waqaslam