С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Dark-VIN
1 / 1 / 0
Регистрация: 16.01.2013
Сообщений: 66
#1

Принцип работы Service - Программирование Android

11.03.2016, 21:37. Просмотров 463. Ответов 9

Здравствуйте, господа.
Не могу понять, что еще может Service, кроме перегружаемых методов? При первом запуске в onStartService или onStartCommand можно писать что угодно, но оно сработает только при старте или перезагрузке сервиса.
Использование в сервисе Timer или AlarmManager или AsyncTask не точная. Например, при загруженности телефона эти методы срабатывают с задержкой.

Да и вообще, нужен ли Service при использовнии AlarmManager? При моем тесте, без использования сервиса и закрытия приложения (System.Exit(0)), AlarmManager писал логи в заданное время с заданой последовательностью... Ну а при загруженности телефона, с задержкой.

На данный момент интересует фоновое выполнение куска кода строго-настрого в точные минуты и секунды, с точным интервалом, как это делает стоковый будильник. Или следует проверять каждую секунду? И нужен ли для этого Service?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2016, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Принцип работы Service (Программирование Android):

Принцип работы приложения - Программирование Android
Привет всем!) Нужна помощь знатоков форумчан. Хотел бы спросить принцип работы следующего вида приложения: допустим есть справочник который...

Принцип работы RecyclerView - Программирование Android
Можете объяснить принципп работы RecyclerView во время скроллинга? Как он заполняется элементами? Сколько элементов находится в каждый...

Service - Программирование Android
Как создать приложение как Service?

App Service - Программирование Android
Возможно ли как-то создать приложение, которое запускает сервис и при этом, если в дальнейшем удалить само приложение, то сервис останется...

Fragments и service - Программирование Android
такой вопрос как реализовать запуск сервиса и обработку результатов приложении где есть fragments.? хотелось бы запускать сервис в...

GPS service - Программирование Android
Написал сервис для работы GPS однако при попытке вытащить данные просто выдаёт 0 класс реализующий работу c GPS: package...

9
vxg
Модератор
3188 / 1991 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
12.03.2016, 10:44 #2
Сервис можно поднять снаружи приложения + если система при высокой загрузке подвинет сервис она поднимет его обратно как только сможет (забитое приложение обратно не поднимется). Создайте в сервисе поток и делайте то что нужно если аларм не устраивает
0
Dark-VIN
1 / 1 / 0
Регистрация: 16.01.2013
Сообщений: 66
12.03.2016, 15:47  [ТС] #3
Цитата Сообщение от vxg Посмотреть сообщение
Сервис можно поднять снаружи приложения
Что вы имеете ввиду?

Цитата Сообщение от vxg Посмотреть сообщение
Создайте в сервисе поток и делайте то что нужно если аларм не устраивает
Вы имеете ввиду "следует проверять каждую секунду?" - а не будет большой нагрузки на систему?

И что насчет AlarmManager без использования Service?
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
12.03.2016, 16:41 #4
Цитата Сообщение от Dark-VIN Посмотреть сообщение
Вы имеете ввиду "следует проверять каждую секунду?"
Я ещё в этом не разбираюсь, но такие вопросы возникают здесь регулярно. Каждую секунду - это жесть, батарейка сядет быстро, а загрузка ЦП сильно подскочит.
0
Dark-VIN
1 / 1 / 0
Регистрация: 16.01.2013
Сообщений: 66
12.03.2016, 19:20  [ТС] #5
Цитата Сообщение от CoolMind Посмотреть сообщение
такие вопросы возникают здесь регулярно
Такое впечатление, что это великий секрет, как написать неубиваемый сервис и создать точный "будильник".

На примере Hourly chime могу сказать, что в этом приложении используется AlarmManager. При ручной смене времени, будильник срабатывает небедленно, как написано в описании класса AlarmManager. Приложение имеет два сервиса и один ресивер.

Но стоковый будильник работает по другому. А вот как... Не может же он ежесекундно сверять время.

На моем HTC One X+ под Android 4.1.2 стоковый будильник содержит следующее:
...

Receivers:
com.htc.android.worldclock.worldclock.WorldClockReceiver
com.htc.android.worldclock.alarmclock.AlarmReceiver
com.htc.android.worldclock.stopwatch.StopwatchReceiver
com.htc.android.worldclock.timer.TimerReceiver

Services:
com.htc.android.worldclock.worldclock.WorldClockService
com.htc.android.worldclock.alarmclock.AlarmService
com.htc.android.worldclock.alarmclock.AlarmHfmService
com.htc.android.worldclock.stopwatch.StopwatchService
com.htc.android.worldclock.timer.TimerService

есть еще Providers и Activity, но они не актуальны в данной теме.

0
vxg
Модератор
3188 / 1991 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
13.03.2016, 08:21 #6
Поднять снаружи означает что если сервис определенным образом оформлен то его можно запускать при необходимости из другого приложения. Нужно ли сверять время каждую секунду - я не знаю специфику вашего приложения. Без использования сервиса у вас нет гарантии того что ваше приложение однажды не прекратит свою работу и не потребует ручного повторного запуска.
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
14.03.2016, 12:30 #7
Dark-VIN, волею судеб заинтересовался данной темой.
Нашёл, что эти все методы неточны. Из темы http://stackoverflow.com/questions/2...ogrammatically увидел ссылку на http://binarybuffer.com/2012/07/exec...sks-in-android, где объясняется, что во сне Андроид не хочет петь и танцевать, если использовать postDelayed с потоком или службой. Читая дальше, обнаружил, что и многие другие методы не работают во сне. Например, http://stackoverflow.com/questions/6...xecutorservice.
Проблема в том, что устройство разбудить по событию, я так понимаю, может AlarmManager через BroadcastReceiver. Остальные не будят.

Добавлено через 15 минут
Я так подумал, если в некоторых статьях рекомендуют использовать ScheduledExecutorService вместо Timer и прочих однополчан, то можно попытаться совмещать его с AlarmManager. Конечно, это усложнит код и повысит нагрузку на процессор, но зато приведёт к нужной точности. Т.е. пока устройство не во сне, использовать ScheduledExecutorService (тут надо не выполнять повторно действия в AlarmManager), а как только оно во сне, ориентироваться на AlarmManager.
0
Dark-VIN
1 / 1 / 0
Регистрация: 16.01.2013
Сообщений: 66
15.03.2016, 00:55  [ТС] #8
Цитата Сообщение от vxg Посмотреть сообщение
если сервис определенным образом оформлен то его можно запускать при необходимости из другого приложения.
Думаю можно. Я запускаю сервис startService(new Intent("d.swan.vki.Service"));

Цитата Сообщение от vxg Посмотреть сообщение
Нужно ли сверять время каждую секунду - я не знаю специфику вашего приложения.
Приложение просто отправляет на сервер запрос и ждет ответа каждые 5 минут, до тех пор пока пользователь вручную не выключит сервис. Если запрос приходит не вовремя, сервер может отбросить запрос.


CoolMind, спасибо! Более менее понятно.
Не понятно, как AlarmManager общается с системой...
Может дать приложению user-permission WAKE_LOCK...

Нашел одно из решений на русском stackoverflow ( блóчится). Буду пробовать гонять телефон по тяжелым приложениям и смотреть логи. Попробую использовать как AlarmManager, так и AsyncTask... Так же и в режиме сна...

Скажите, куда лучше помещать вызовы, в onCreate или onStartCommand?
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,734
15.03.2016, 10:15 #9
Цитата Сообщение от Dark-VIN Посмотреть сообщение
Может дать приложению user-permission WAKE_LOCK...
Где-то там же написано, что это не поможет, т.к. пользователь может вручную отключить дисплей.
AlarmManager общается через BroadcastReceiver. Т.е. надо прописывать события onReceive.
0
Dark-VIN
1 / 1 / 0
Регистрация: 16.01.2013
Сообщений: 66
17.03.2016, 14:08  [ТС] #10
Цитата Сообщение от CoolMind Посмотреть сообщение
AlarmManager общается через BroadcastReceiver. Т.е. надо прописывать события onReceive.
Нет, нет. Я имел ввиду на низком уровне. Как формируется в системе.
0
17.03.2016, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2016, 14:08
Привет! Вот еще темы с ответами:

Автозагрузка Service - Программирование Android
Привет, люди! Давно бьюсь с автозапуском сервисов. Скиньте, пожалуйста РАБОЧИЙ пример сего действа, иначе я вообще никогда так и не...

Работа с Service - Программирование Android
Всем добрый вечер! Есть приложение под андроид. С активити, с интерфейсом, всё как нужно. Теперь потребовалось сделать из него фоновое...

SQLite из Service - Программирование Android
Здравствуйте, у меня такой вопрос. Уже бьюсь 2 дня, ни как не могу сделать. Может вы мне поможете советом, а лучше примером. Как...

SQLite в Service - Программирование Android
Всем привет! Коллеги, возможно ли подключаться к базе и выполнять с ней все действия из Сервиса. Активити у меня нет, в программе 3...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.