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

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 01 июл 2012, 23:00

В этом уроке:
- создаем, запускаем и останавливаем простой сервис


Click here to read this article!
Последний раз редактировалось damager82 22 май 2017, 23:41, всего редактировалось 9 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 31 авг 2012, 14:17

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 31 авг 2012, 14:43

Приложение не закрывается кнопкой назад, оно сворачивсется и продолжает висеть в памяти. Если системе понадобится свободная память она сама вырубет неактивные приложения.
Такова архитектура андроид.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 31 авг 2012, 14:54

ок

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

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

Сообщение Coment » 18 сен 2012, 17:37

Здравствуйте.

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

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 18 сен 2012, 19:03

Я сую его в отдельный процесс и получается - сервис сам по себе, приложение само по себе

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 18 сен 2012, 19:08

Coment оба утверждения автора являются правильны, так как в первом он не говорил о потоке, о чём вы приводите вторую его цитату.
Если не давать сервису поток, то он конечно будет выполнятся в основном. А на счёт блокирует экран - так это не есть взаимодействие с UI.
R.id.team
Политика на форуме запрещена

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

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

Сообщение Coment » 18 сен 2012, 19:51

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 18 сен 2012, 20:41

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

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

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

Сообщение Coment » 18 сен 2012, 20:59

Спасибо за развернутый ответ.

Просто, как я уже писал выше, я подумал, что в 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 осознал, просто интересовала реализация.
Последний раз редактировалось Coment 18 сен 2012, 21:07, всего редактировалось 1 раз.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 18 сен 2012, 21:06

Можете использовать 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.)

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

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

Сообщение Coment » 18 сен 2012, 21:16

О... стоит присмотреться. Спасибо, есть теперь чем заняться на досуге =)

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 21 дек 2012, 11:24

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 21 дек 2012, 20:22

powercat
Как я уже говорил что в сервисах не разбираюсь но что то мне не верится, вот только закончили проект, у него сервисы делают апдейт базы, апдейт может идти и несколько минут, за это время телефон блокироваться может десятки раз и почему то всё работает... Но к сожалению (а может и к счастью) не я эту часть писал =)
R.id.team
Политика на форуме запрещена

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 22 дек 2012, 10:09

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

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 24 дек 2012, 14:44

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

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 24 дек 2012, 14:52

Отлично

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 01 янв 2013, 16:56

Как я и говорил что не верю то всё таки оказался прав, можно делать бесконечный сервис. Много текста, так что дам подсказку, читайте книгу "Android 4 для профессионалов. Создание приложений для планшетных компьютеров и смартфонов. Сатия Коматинени, Дэйв Маклин", а именно глава 19. Сразу скажу что на русском в электронном варианте не найти, купить можно.
R.id.team
Политика на форуме запрещена

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 15 янв 2013, 10:59

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

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

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

Сообщение powercat » 15 янв 2013, 15:02

а разве это не контектстное меню?

Ответить