2

У меня есть приложение, которое запускает определенный «длинный» процесс при открытии или когда устройство загружено.Android - Сервис или IntentService?

Процесс выполняет определенное количество загрузок через диспетчер загрузки, а когда процесс завершается, он отправляет событие вещания в приложение, чтобы захватить некоторые аналитики.

Как я понимаю, всякий раз, когда вызывается событие трансляции, класс Application запутан (если не в памяти уже).

Application класс также инициируется, когда пользователь открывает приложение.

На основании этого код для запуска процесса находится внутри onCreate метода класса Application. (процесс начинает новый поток оттуда)

Однако, похоже, что «длинный» процесс занимает больше времени жизни приемника вещания для вещания (около 10 секунд?), поэтому процесс приложения убит. Затем через пару секунд после завершения загрузки будет отправлено второе широковещательное сообщение, и приложение снова запустится с вызовом Application.onCreate с некоторыми нежелательными эффектами.

Ожидается, что процесс должен выполняться одним линейным способом, а не снова звонить onCreate.

Поскольку этот процесс происходит только один раз, я думал о создании Service, чтобы дать больше времени приложению, чтобы остаться в живых. Однако процесс зависит от DownloadManager так:

1) Использование IntentService не будет работать (как я понимаю), потому что процесс все еще убит после возвращения handleIntent. Процесс создает новые потоки, поэтому его задачи выполняются async, и метод handleIntent вернется до завершения всего процесса.

2) Должен ли я создать Service, который является просто «живым» в течение некоторого времени, а затем останавливается после завершения процесса?

3) В качестве дополнительного вопроса, если у меня есть работа Service, будет ли создаваться экземпляр класса «Application», пока Служба не будет остановлена?

+0

Вы блокируете метод 'onReceive' вашего BroadcastReceiver более 10 секунд? – waqaslam

+0

@waqaslam no, BroadcastReceiver ничего не делает в отношении этого процесса, процесс управляется из класса Application. – htafoya

+0

Вместо того, чтобы делать это в 'onCreate' приложения, я предлагаю вам создать« IntentService »внутри' onReceive' вашего BroadcastReceiver. Это не будет занимать основной поток пользовательского интерфейса, поскольку IntentService работает в фоновом потоке. Кроме того, (в качестве альтернативы) вы также можете использовать 'JobScheduler', поскольку он поставляется с некоторыми отличными функциями. – waqaslam

ответ

1

Если вы делаете это только один раз, вы должны просто создать свой собственный Service. Когда начнется ваше приложение, позвоните по номеру startService(). В onStartCommand() вашего Service запустите фон Thread, который сделает то, что вы хотите, и верните START_STICKY (Это держит ваш Service бегом, пока вы его не остановите). Когда закончится Thread, позвоните по номеру stopSelf() по номеру Service.

Конечно, вы можете использовать IntentService, но этот класс является просто расширением Service, что обеспечивает вам еще один уровень удобства.IntentService управляет пулом фоновых потоков и заботится о запуске и остановке Service, когда заканчивается работа. Это, вероятно, слишком велико для того, что вам нужно, но продолжайте использовать его, если хотите. Компромиссы здесь незначительны.

ПРИМЕЧАНИЕ. <opinion> По некоторым причинам многим разработчикам, похоже, нравятся определенные «причудливые» решения, такие как AsyncTask, IntentService и Event Bus. Существует множество других способов решения проблем. В разработке программного обеспечения нет «одного размера». </opinion>

0

Вы все еще можете использовать служебную службу, вам просто нужно заблокировать во время выполнения фоновой задачи. Реализация может работать следующим образом:

Положите его в службу, IntentService может работать следующим образом:

public class DownloadIntentService extends IntentService { 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    //get url or whatever from intent 
    //kick off async code to start the download, something like eg: 
     DownloadTask downloadTask = new DownloadTask(url); 
     downloadTask.setListener(new Listener() { 
      public void onComplete(Download download) { 
       DownloadIntentService.this.notify(); 
      } 
     } 
     downloadTask.start() 
     wait(); 

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^