Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,593
Записей в блоге: 2
#1

Запустить сервис в другом потоке - Android

13.07.2016, 14:32. Просмотров 296. Ответов 8
Метки нет (Все метки)

Как правильно запустить сервис в другом потоке?

Сервис должен работать всегда (даже когда приложение закрыто)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Борис Верещагин
59 / 38 / 12
Регистрация: 14.01.2016
Сообщений: 183
Завершенные тесты: 4
13.07.2016, 15:13     Запустить сервис в другом потоке #2
Java
1
2
3
4
5
6
Thread t = new Thread(){
    public void run(){
        //запустить сервис
    }
};
t.start();
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,219
13.07.2016, 16:03     Запустить сервис в другом потоке #3
сервис же компонент главного потока то есть UI. Там же активити, сервис, ресивер и провайдер. Сервис запускается в основном потоке, а разве можно его запустить в другом потоке?
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,593
Записей в блоге: 2
13.07.2016, 16:06  [ТС]     Запустить сервис в другом потоке #4
Сервисы запускаются в главном потоке приложения; это значит, что любые операции, выполняющиеся в обработчике onStartCommand(), будут работать в контексте главного потока GUI. На практике при реализации сервиса в методе onStartCommand() создают и запускают новый поток, чтобы выполнять операции в фоновом режиме и останавливать сервис, когда работа завершена.

Так и сделал
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,219
13.07.2016, 16:07     Запустить сервис в другом потоке #5
Java
1
2
3
4
5
6
Thread t = new Thread(){
    public void run(){
        //запустить сервис
    }
};
t.start();
а причем этот код тогда?
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,593
Записей в блоге: 2
13.07.2016, 16:29  [ТС]     Запустить сервис в другом потоке #6
Если в сервисе делаю следующее:
Java
1
2
3
4
5
6
7
8
9
10
@Override
    public void onCreate() {
        Notification.Builder builder = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher);
        Notification notification;
        if (Build.VERSION.SDK_INT < 16)
            notification = builder.getNotification();
        else
            notification = builder.build();
        startForeground(777, notification);
то при полном закрытии приложения (активностей) сервис продолжает работать..

А если не выводить Notification сообщение то при закрытии приложения сервис тоже грохается.

Вопрос как сделать сервис независимым от приложения(активностей)?
vxg
Модератор
3023 / 1825 / 190
Регистрация: 13.01.2012
Сообщений: 6,926
13.07.2016, 16:50     Запустить сервис в другом потоке #7
ILNAR_93, сервис и так не зависит от активностей. во всех приведенных примерах сервиса мы что то так и не увидели
ILNAR_93
Android
217 / 217 / 21
Регистрация: 19.01.2013
Сообщений: 1,593
Записей в блоге: 2
13.07.2016, 16:57  [ТС]     Запустить сервис в другом потоке #8
vxg,
Я на счет того что если пользователь очистить недавно открытые приложения то сервис тоже грохается..
Там так-же есть пример с Notification сообщением - для того чтобы сервис не грохался при очистке недавних приложений

Есть статья в хабре https://habrahabr.ru/post/265159/

Со статьи:
Официальная документация гласит, что ОС Android останавливает службу только в случае нехватки памяти. Тем не менее, существует и другие случаи. Пользователь может сам остановить службу, используя предоставляемые ему средства меню Settings/Apps, там же он может сделать и полную остановку приложения. Но для этого ему надо напрягаться и, в общем-то осознавать свои действия и их последствия. К сожалению, для уничтожения службы у него есть и другие возможности, которыми он может пользоваться бессознательно. В частности, если в нашем приложении ранее была запущена хоть одна Activity, видимая в истории, то пользователь буквально одним движением пальца сможет вынести соответствующую задачу. Как ни парадоксально, попутно Android вышибет и весь процесс вместе со службой.
Лично мне такое поведение Android логичным не кажется. Пользователь зачастую просто чистит Recent Apps от давно забытого хлама, совсем не обязательно он при этом желает отказаться от тех благ, которые ему предоставляла выполняющаяся служба. Однако разработчики Google мыслили немного по-другому. По-другому, так по-другому, их право, но в конце концов нам с вами тоже надо как-то жить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2016, 18:30     Запустить сервис в другом потоке
Еще ссылки по теме:

Неубиваемый сервис Android
Android Как из Активити запустить сервис ?
Android Сервис не останавливается
Android Не устанавливается сервис

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

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
15.07.2016, 18:30     Запустить сервис в другом потоке #9
Когда-то разобрался с этим (правда уже пол года за андроид не брался - подзабыл немножко)...

Есть понятие аппликэйшн. Все активити работают "из него". Сервис тоже запускается "от аппликэйшн". При полном закрытии программы (нажать хоум и слвайпом удалить программу) иногда убиваются и сервисы.
Можно обнадежить выведя нотиф. (как указано выше). Где-то встречал как сделать "невидимый нотиф" (типа вызывается, но не выводится). Где-то встречал как вызвать сервис "с повышенными правами" (без рута - хакерский прием - типа как "системную" помечаем).
А можно вызвать из глобального ресивера. Но если он создан И в активити, то он все еще привязан к основному аппликэйшн. Можно его вызвать сразу из ресивера (отправив из активити "запрос"). Тогда сервис создаст "копию" аппликэйшн (я долго это разбирал - хранил глобальные переменные в классе аппликэшн и они то были доступны, то пропадали).
Если ресивер "общий" (например на изменение заряда), то сервис будет часто "перезапускаться" - так можно его "обнадежить" даже на случай зависания/перезагрузки. (ресивер "при запуске устройства" иногда не вызывается).

запуск из потока не пробовал! Но подозреваю что все потоки запущенные из активити привязаны к одному аппликэйшн, а он убивается вместе с программой (удалением ее из памяти)

...вроде все! удачи...
Yandex
Объявления
15.07.2016, 18:30     Запустить сервис в другом потоке
Ответ Создать тему
Опции темы

Текущее время: 09:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru