Урок 98. Service. Локальный биндинг

Обсуждение уроков
Vovich
Сообщения: 30
Зарегистрирован: 30 май 2013, 15:03

Re: Урок 98. Service. Локальный биндинг

Сообщение Vovich » 08 май 2014, 16:16

begemota писал(а):
Imalur писал(а):
etlt писал(а):Подскажите кто сталкивался:
код из примера на строчке
myService = ((MyService.MyBinder) binder).getService();
выходит ошибка приложения и полное зависание
Класс MyBinder в MyService существует, по идеи все должно работать, но "binder" почему то не приводится к MyService.MyBinder - ошибка
аналогичная ситуация. никто не подскажет - как это побороть?
была аналогичная проблема... решилось очень просто...
дело в том что сервис должен запускаться в основном потоке... почти наверняка уверен что Вы в манифесте при описании сервиса использовали android:process=":nameofbindingprocess"
уберите эту строчку - и все заработает
Такая же ошибка и строчки android:process=":nameofbindingprocess" в манифесте нет. :(

Vovich
Сообщения: 30
Зарегистрирован: 30 май 2013, 15:03

Re: Урок 98. Service. Локальный биндинг

Сообщение Vovich » 09 май 2014, 10:26

упс-с
сам ошибочку допустил - все нормально работает

JuriBK
Сообщения: 1
Зарегистрирован: 21 май 2014, 13:22

Re: Урок 98. Service. Локальный биндинг

Сообщение JuriBK » 21 май 2014, 13:25

Я создал Service в Activity.
Почему при закрытии Activity убивается и Service?

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 98. Service. Локальный биндинг

Сообщение elron » 28 окт 2014, 19:27

Вопрос: как сервису узнать что активити закрыто/открыто (?) и можно ли отправлять ему интенты через броудкаст ? Предполагаю что перед закрытием активити нужно в onClose менять значение/флаг в сервисе, типа myService.canSendToAcMain = false; и т.о. сервис будет знать что отправлять не нужно. Такой код пригоден ?!

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 98. Service. Локальный биндинг

Сообщение GRAF_COLLIOSTRO » 30 мар 2015, 14:57

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

никакие методы остановки сервиса корректно мгновенно его не останавливают. Если даже и останавливают то тут-же перезапуск... повтыкал логи и начал играть в кошки мышки. Как я понял сервис получает команду на смерть и после этого система его может убить (не факт что мгновенно). Если активити вызвавшее сервис ещё живо... может уже дестрой, но не очищено из памяти, то сервис не убивается... Кнопка назад естессвтенно не убивает активити и ситуация такая же... в итоге решил откровенно забить на живучесть сервиса. Я сделал stopself и достаточно. По мере тасования ресурсов в памяти он рано или поздно умрёт. пусть и не мгновенно. На этом месте я смирился)))

теперь у меня другое) - у меня блютусовские команды обмена вынесены в сервис. там сидят все стримы и прочая...
запускаю сервис в onCreate активити... сервис на onCreate подготавливает сокет и стримы... дальше биндинг... всё замечательно, НО!!!

не соображу как победить наклон андройда(((

новое активити запускает новый сервис. их становится ДВА(

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

короче я запутался и вас сейчас запутаю(((

вопрос звучит просто: как переконнектится из нового активити к существующему сервису не убивая сервис при наклоне девайса???

крышу уже сносит от методов старта и передачи данных туда сюда(((

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 98. Service. Локальный биндинг

Сообщение klblk » 31 мар 2015, 07:28

Насколько я знаю 2 одинаковых сервиса запустить нельзя. Во второй раз вызовется onStartCommand(), но onCreate() сервиса вызываться не будет. И об этом есть в уроках (самый первый по сервисам).

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 98. Service. Локальный биндинг

Сообщение GRAF_COLLIOSTRO » 31 мар 2015, 10:00

если я в onDestroy активити захлапываю сервис, то запускается новый onСreate... но логи из первого незахлопнутого продолжают какоето время идти...

меня не устраивает то, что на onСreate сервис заново начинает коннектится к блютусу... мне нужно чтобы он не убивался, а новое активити к нему цеплялось и биндило его дальше...

и ещё нужно чтобы при выходе из программы всёжтаки и сервис отключался... - это вот всю логику порттит)))

в итоге получается каша с состояниями одного и другого... ничего умнее не придумал как создать флаг и запихать его в preference

если кто подскажет что-то умнее буду безумно рад

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 98. Service. Локальный биндинг

Сообщение klblk » 31 мар 2015, 10:40

Так зачем вы его убиваете в активити?
Запустите его один раз в onCreate() (startService()).
bind/unbind в onStart()/onStop()
В onDestoy() уничтожаете сервис только в случае если активити явно закрывается (if(isFinishing()))

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 98. Service. Локальный биндинг

Сообщение GRAF_COLLIOSTRO » 31 мар 2015, 11:20

klblk писал(а):...
вооот... вот это и хотел услышать!!! спасибо! пойду мучать. выглядит очень логично)

Sergiy_GT
Сообщения: 11
Зарегистрирован: 06 апр 2015, 13:09

Re: Урок 98. Service. Локальный биндинг

Сообщение Sergiy_GT » 17 май 2015, 16:17

Добрый день!
Уменя такой вопрос: В Service играет MediaPlayer, а кнопки управления находятся в разных Activity. И при нажатии, допустим, на кнопку "Play/Pause" её иконка меняется на соответствуюшую. Но при переходе на другую Activity или смену ориентации экрана создаётся ситуация когда - MediaPlayer выключен а иконка отображает что включён и может быть наоборот, что MediaPlayer играет а иконка показывает что он выключен. Следовательно есть необходимость мониторить состояние MediaPlayer в Service и передавать его состояние в Activity, чтобы та должным образом устанавливала иконки на кнопку. Так вот подскажите как это можно риализовать? Возможно есть другие варианты?

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 98. Service. Локальный биндинг

Сообщение GRAF_COLLIOSTRO » 18 май 2015, 05:27

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

суть в следующем: закодируйте состояния плейера: 0 - молчит. 1 - воспроизводит, 2 - пауза и тд... что там ещё бывает? в стринг можно запихать что именно он воспроизводит... учитывая, что у сервиса свои переменные, а у активити свои, нужно реализовать связку. детский метод - это преференсес... внутри одного пака доступ к нему имеют все - сервис сохраняет, активити достаёт и читает.

Sergiy_GT
Сообщения: 11
Зарегистрирован: 06 апр 2015, 13:09

Re: Урок 98. Service. Локальный биндинг

Сообщение Sergiy_GT » 18 май 2015, 17:39

Я 2 месяца как только начал изучать андроид программирование, что значит "закодируйте состояния плейера: 0 - молчит. 1 - воспроизводит, 2 - пауза и тд..." - как это риализовать? И "у сервиса свои переменные, а у активити свои, нужно реализовать связку" - я непонимаю как это сделать. Можно подробние, с кодом.

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 98. Service. Локальный биндинг

Сообщение GRAF_COLLIOSTRO » 20 май 2015, 06:35

тогда ковыряйте PREFERENCES) нужно чтобы вы понимали механизм хранения данных
вот тут: http://startandroid.ru/ru/uroki/vse-uro ... ences.html

берёте две переменных. Например, stat типа integer и playsong типа string

в сервисе каждый раз когда меняется состояние плейера записываете это состояние в stat.
по умолчанию у вас там 0 - плейер молчит
запустили песенку - записали туда 1
поставили на паузу - записали туда 2
кончилась песенка - записали туда 0

эта переменная отображает текущее состояние плейера

в текстовом виде можно также записывать что именно сейчас воспроизводится. имя воспроизводимого файла записываем в playsong.
это всё должен делать сервис

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

более подробно с кодом к сожалению нет времени писать. по сути вам нужно совместить этот урок с биндингом и тот, который по ссылке с preferences.

доступ к preferences есть из любой части программы... и сервис и активити могут читать/сохранять эти переменные без заморочек. пробуйте, всё полчится

Sergiy_GT
Сообщения: 11
Зарегистрирован: 06 апр 2015, 13:09

Re: Урок 98. Service. Локальный биндинг

Сообщение Sergiy_GT » 20 май 2015, 14:22

GRAF_COLLIOSTRO писал(а):тогда ковыряйте PREFERENCES) нужно чтобы вы понимали механизм хранения данных
вот тут: http://startandroid.ru/ru/uroki/vse-uro ... ences.html

берёте две переменных. Например, stat типа integer и playsong типа string

в сервисе каждый раз когда меняется состояние плейера записываете это состояние в stat.
по умолчанию у вас там 0 - плейер молчит
запустили песенку - записали туда 1
поставили на паузу - записали туда 2
кончилась песенка - записали туда 0

эта переменная отображает текущее состояние плейера

в текстовом виде можно также записывать что именно сейчас воспроизводится. имя воспроизводимого файла записываем в playsong.
это всё должен делать сервис

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

более подробно с кодом к сожалению нет времени писать. по сути вам нужно совместить этот урок с биндингом и тот, который по ссылке с preferences.

доступ к preferences есть из любой части программы... и сервис и активити могут читать/сохранять эти переменные без заморочек. пробуйте, всё полчится
Большое спасибо буду пробовать.

netfinity
Сообщения: 13
Зарегистрирован: 07 июл 2015, 19:45

Re: Урок 98. Service. Локальный биндинг

Сообщение netfinity » 05 авг 2015, 19:54

Можно ли по данному примеру подключившись к сервису изменить публичну стринг сервиса?
или биндиг изменяет только то, что работает в онстарткоманд?

K_Vladimir
Сообщения: 36
Зарегистрирован: 28 июн 2015, 03:13

Re: Урок 98. Service. Локальный биндинг

Сообщение K_Vladimir » 07 авг 2015, 13:45

Доброго дня.

Я конечно могу ошибаться но по поводу останова сервиса, пока
поток tTask не завершишь, сервис так и перезапускается.
Но даже после этого в мониторе процессов он висит. Пока не остановишь.

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

@Override
    protected void  onDestroy(){
        super.onDestroy();
        if(isFinishing()) {
            if (myService.tTask != null) myService.tTask.cancel();
            stopService(intent);
        }
    }
Но мне кажется что так останавливать не правильно.
И единственно правильно его остановить, это устроить проверку завершения программы
в методе run()

И ещё вопрос: tTask в главном потоке отрабатывает или нет?

Аватара пользователя
Yennefer
Сообщения: 18
Зарегистрирован: 02 янв 2015, 17:36

Re: Урок 98. Service. Локальный биндинг

Сообщение Yennefer » 07 апр 2016, 14:13

Всем привет.

Подскажите, пожалуйста, правильно ли я поняла, что при использовании локального биндинга, т.е. когда Сервис запущен в одном процессе с Активити, при закрытии Активити сервис всегда убивается и нет никакой возможности обеспечить его жизнь за пределами Активити?
Использую стороннюю библиотеку, которая предоставляет сервис, заточенный только под локальный биндинг.

NatNiM
Сообщения: 1
Зарегистрирован: 08 май 2016, 16:51

Re: Урок 98. Service. Локальный биндинг

Сообщение NatNiM » 08 май 2016, 16:52

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

Davydov
Сообщения: 3
Зарегистрирован: 06 янв 2020, 13:08

Re: Урок 98. Service. Локальный биндинг

Сообщение Davydov » 06 янв 2020, 13:14

Как заставить работать GPS в service ? После выхода из приложения service работает, но координаты прекращают поступать

Ответить