Страница 1 из 5

Урок 92. Service. Простой пример

Добавлено: 01 июл 2012, 23:00
damager82
В этом уроке:
- создаем, запускаем и останавливаем простой сервис


Click here to read this article!

Re: Урок 92. Service. Простой пример

Добавлено: 31 авг 2012, 14:17
powercat
Экспериментирую...приложение и сервис в разных процессах.
А почему после уничтожения сервис остается видим в Devices (в процессах)? И приложение, я его кнопкой Назад закрываю, тоже остается висеть в процессах...разве они не должны оттуда пропасть?

Re: Урок 92. Service. Простой пример

Добавлено: 31 авг 2012, 14:43
KamiSempai
Приложение не закрывается кнопкой назад, оно сворачивсется и продолжает висеть в памяти. Если системе понадобится свободная память она сама вырубет неактивные приложения.
Такова архитектура андроид.

Re: Урок 92. Service. Простой пример

Добавлено: 31 авг 2012, 14:54
powercat
ок

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 17:37
Coment
Здравствуйте.

Эмм... возможно я придираюсь, но:
Итак, сервис – это некая задача, которая работает в фоне и не использует UI.
А потом, после добавления кода в someTask();
Вывод – сервис работает в основном потоке и блокирует экран.
То есть, насколько я понял, надо все ровно создавать отдельный поток?

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 19:03
powercat
Я сую его в отдельный процесс и получается - сервис сам по себе, приложение само по себе

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 19:08
rezak90
Coment оба утверждения автора являются правильны, так как в первом он не говорил о потоке, о чём вы приводите вторую его цитату.
Если не давать сервису поток, то он конечно будет выполнятся в основном. А на счёт блокирует экран - так это не есть взаимодействие с UI.

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 19:51
Coment
Честно, не сочтите за придирку и троллинг, хочу досконально разобраться, так как пишу сейчас проект и планирую в скором времен попасть на должность juniora (эх... мечты = :roll: ), так вот: Graphic User Interface (GUI, UI) основной поток в котором не рекомендуется выполнять "тяжелые" задачи. Я читаю, что "service - не использует UI для своих задач" - так сказать работает в фоновом режиме. Если же мы даем ему конкретную задачу он использует UI,так?
Тогда еще вопрос - зачем мне запускать service без конкретной задачи, только для того, что бы он не занимал UI? Я понимаю, что service весьма полезный компонент, который позволяет реализовать мои задачи, даже при выключенном activity, но вот пока еще (лично для меня) остается непонятным моменты данного урока. Я думал, что все что мы "скормим" service - само будет распределятся по разным потокам и мне не нужно будет это ручками прописывать :)
Извините за такой вот каламбур. Просто, на данный момент, этот сайт и форум самые адекватные и содержательные по теме Android (Это не лесть, а правда) потому я решаюсь задавать тут вопросы ;)

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 20:41
rezak90
Я читаю, что "service - не использует UI для своих задач" - так сказать работает в фоновом режиме. Если же мы даем ему конкретную задачу он использует UI, так?
Не так. Вы видимо не до конца поняли суть и само понятия сервиса. Проведу аналогию с виндовс, там есть службы - например dns (все знают что она делает), так вот вы как пользователь её не видите но она есть и выполняет свою поставленную задачу.
Ну и UI понятное дело что расшифровывается как интерфейс пользователя и соответственно пользователь никак не может взаимодействовать с сервисом так как он для него "визуально не видим".
Приведу пример из приложения под андрюшку: клиент-серверное приложение - клиент это и есть наше приложение на андрюше, оно принимает какие то данные с сервера каждую минуту, так вот за приём данных отвечает сервис (служба) который дальше оповещает/передаёт данные в активити и дальше происходит взаимодействие приложение с пользователем. Просто вы ж не будете всё это писать в приложении, так как пользователь закроет приложение и взаимодействие с сервером утрачено, а так он может закрыть приложение а сервис будет спокойно работать и когда придут новые данные с сервера он оповестит (или запустит приложение) пользователя (но не через какой либо UI, так как он не видим).

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 20:59
Coment
Спасибо за развернутый ответ.

Просто, как я уже писал выше, я подумал, что в android и мы конечно, давая service какую либо задачу, сей компонент сам будет создавать потоки, то бишь когда пишем

Код: Выделить всё

 void someTask() {
    for (int i = 1; i<=5; i++) {
      Log.d(LOG_TAG, "i = " + i);
      try {
        TimeUnit.SECONDS.sleep(1);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }


то бдет работать как

Код: Выделить всё

 void someTask() {
    new Thread(new Runnable() {
      public void run() {
        for (int i = 1; i<=5; i++) {
          Log.d(LOG_TAG, "i = " + i);
          try {
            TimeUnit.SECONDS.sleep(1);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        stopSelf();
      }
    }).start();
  }
Ну вроде если бы мы не писали отдельно потоки и handler, а вместо этого использовали async task, который сам все делает :)
А так, еще раз спасибо, предназначение service осознал, просто интересовала реализация.

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 21:06
AndreyI
Можете использовать IntentService
Он тоже сам все делает ;)
Extending the IntentService class

Because most started services don't need to handle multiple requests simultaneously (which can actually be a dangerous multi-threading scenario), it's probably best if you implement your service using the IntentService class.

The IntentService does the following:
Creates a default worker thread that executes all intents delivered to onStartCommand() separate from your application's main thread.
Creates a work queue that passes one intent at a time to your onHandleIntent() implementation, so you never have to worry about multi-threading.
Stops the service after all start requests have been handled, so you never have to call stopSelf().
Provides default implementation of onBind() that returns null.
Provides a default implementation of onStartCommand() that sends the intent to the work queue and then to your onHandleIntent() implementation.

All this adds up to the fact that all you need to do is implement onHandleIntent() to do the work provided by the client. (Though, you also need to provide a small constructor for the service.)

Re: Урок 92. Service. Простой пример

Добавлено: 18 сен 2012, 21:16
Coment
О... стоит присмотреться. Спасибо, есть теперь чем заняться на досуге =)

Re: Урок 92. Service. Простой пример

Добавлено: 21 дек 2012, 11:24
powercat
Хочу к автору обратиться....
Просто необходимо указать в уроке, что у сервиса есть подлянка, что при блокировке реального телефона он уходит в паузу, и код в нем не будет выполняться.
Именно это у меня сейчас и случилось - написал код, который должен работать в фоне, все работает на эмуляторе, а в реальном теле - пауза. Буду щас переписывать все под аларманагер из-за этого...
Это надо написать, чтобы народ не надеялся на корректную работу и не делал моих ошибок )))

Re: Урок 92. Service. Простой пример

Добавлено: 21 дек 2012, 20:22
rezak90
powercat
Как я уже говорил что в сервисах не разбираюсь но что то мне не верится, вот только закончили проект, у него сервисы делают апдейт базы, апдейт может идти и несколько минут, за это время телефон блокироваться может десятки раз и почему то всё работает... Но к сожалению (а может и к счастью) не я эту часть писал =)

Re: Урок 92. Service. Простой пример

Добавлено: 22 дек 2012, 10:09
powercat
Там есть же шняжка, не дающая телу заблокироваться, но это разовая хрень...с таймертаском же сервис не сочетается...
Тем не менее, подлянка есть, и если ее не оговорить заранее, то у того, кто надеется, что сервис живет всегда, будет облом, если он все на него завяжет...

Re: Урок 92. Service. Простой пример

Добавлено: 24 дек 2012, 14:44
damager82
powercat писал(а):Хочу к автору обратиться....
Просто необходимо указать в уроке, что у сервиса есть подлянка, что при блокировке реального телефона он уходит в паузу, и код в нем не будет выполняться.
Именно это у меня сейчас и случилось - написал код, который должен работать в фоне, все работает на эмуляторе, а в реальном теле - пауза. Буду щас переписывать все под аларманагер из-за этого...
Это надо написать, чтобы народ не надеялся на корректную работу и не делал моих ошибок )))
Я сам недавно об этом узнал в боевых условиях )
Думаю, будет по этой теме отдельный урок, когда разберусь полностью с темой.

Re: Урок 92. Service. Простой пример

Добавлено: 24 дек 2012, 14:52
powercat
Отлично

Re: Урок 92. Service. Простой пример

Добавлено: 01 янв 2013, 16:56
rezak90
Как я и говорил что не верю то всё таки оказался прав, можно делать бесконечный сервис. Много текста, так что дам подсказку, читайте книгу "Android 4 для профессионалов. Создание приложений для планшетных компьютеров и смартфонов. Сатия Коматинени, Дэйв Маклин", а именно глава 19. Сразу скажу что на русском в электронном варианте не найти, купить можно.

Re: Урок 92. Service. Простой пример

Добавлено: 15 янв 2013, 10:59
G_O_R
подскажите пожалуйста название события когда выделяешь текст и появляется панель со значками копировать вставить и тд. нужно в сервисе написать чтоб если кто то текст выделяет то вместе с системным панелью появился и кнопка или 2 кнопки свои.

Re: Урок 92. Service. Простой пример

Добавлено: 15 янв 2013, 15:02
powercat
а разве это не контектстное меню?