Фоновый сервис Android - PullRequest
       35

Фоновый сервис Android

0 голосов
/ 23 августа 2011

Я читаю документы, и чем больше времени я провожу, тем больше путаюсь, какой самый простой способ выполнить то, что я пытаюсь сделать. Я хочу написать простой Сервис, который начинается с кнопки onClick и привязывается к активности. И когда действие закрывается и запускается позже (а не только перезапускается!), Я хочу проверить, запущена ли уже служба, и выполнить привязку к ней. Как мне это сделать?

Спасибо

Ответы [ 3 ]

12 голосов
/ 23 августа 2011

"Если вы запустите службу Android с помощью startService (..), эта служба будет работать до тех пор, пока вы явно не вызовете stopService (..). Существует две причины, по которым система может запускать службу. Если кто-то вызывает Context.startService (), затем система извлекает службу (создает ее и при необходимости вызывает ее метод onCreate ()), а затем вызывает ее метод onStartCommand (Intent, int, int) с аргументами, предоставленными клиентом.продолжайте работу, пока не будут вызваны Context.stopService () или stopSelf (). Обратите внимание, что множественные вызовы Context.startService () не вкладываются (хотя они приводят к нескольким соответствующим вызовам onStartCommand ()), поэтому независимо от того, сколько разслужба будет остановлена ​​после вызова Context.stopService () или stopSelf (), однако службы могут использовать свой метод stopSelf (int), чтобы гарантировать, что служба не будет остановлена ​​до тех пор, пока не будут обработаны запущенные намерения.

Клиенты также могут использовать Context.bindService () для полученияn постоянное подключение к услуге.Это также создает службу, если она еще не запущена (вызывая при этом onCreate ()), но не вызывает onStartCommand ().Клиент получит объект IBinder, который служба возвращает из своего метода onBind (Intent), что позволяет клиенту затем выполнить обратные вызовы службе.Служба будет работать до тех пор, пока соединение установлено (независимо от того, сохраняет ли клиент ссылку на IBinder службы).Обычно возвращаемый IBinder предназначен для сложного интерфейса, написанного на aidl.

Служба может быть запущена и иметь связанные с ней соединения.В таком случае система будет поддерживать работу службы до тех пор, пока она либо запущена, либо имеется одно или несколько подключений к ней с флагом Context.BIND_AUTO_CREATE.Если ни одна из этих ситуаций не выполняется, вызывается метод onDestroy () службы, и служба эффективно завершается.Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена после возврата из onDestroy (). "

Вы можете проверить, работает служба или нет:

public boolean isServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if ("com.example.app.ServiceClassName".equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}
1 голос
/ 23 августа 2011

В этом сценарии, я думаю, вам нужно использовать только AsyncTask надеюсь, это поможет

0 голосов
/ 23 августа 2011

Чтобы выполнить фактическую привязку сервисов к действиям в Android, вам нужно расширить класс Service и привязать сервис к вашей активности (и, возможно, использовать Android AIDL для связи между активностью и сервисом).Тем не менее, в вашем примере звучит так, как будто вы можете сойти с рук, просто используя отдельный поток в вашей деятельности.Используйте либо работоспособный, либо AsyncTask.Как только пользователь нажимает кнопку, которая запускает onClick, установите для статического логического значения в вашем приложении значение true.Затем, при повторном входе в действие, просто проверьте это логическое значение на true и, если true, снова запустите поток.

...