Более подробный принцип работы Сервиса Android14.11.2017, 20:58. Показов 1386. Ответов 6
Метки нет (Все метки)
Здравствуйте всем, я хочу понять, как работает Сервис Android более подробно, то о чем не показывают в видео уроках и не пишут в книгах, а если и пишут, то эту информацию не так просто найти.
В частности, объясните, кто знает такую вещь. Вот, допустим запустили мы какой-то сервис, а приложение полностью закрыли. Сервис продолжает работать. Увидеть мы это можем по существующему процессу в утилите Android Device Monitor. Но, если наш Сервис в процессе запуска и работы обращается к какому-нибудь другому нашему пользовательскому классу в нашем приложении, то по сути, при закрытии нашего приложения, из памяти выгрузятся все наши классы и Сервис уже не сможет работать (потому что обращался к одному из классов). Т.е., что я хочу подчеркнуть - то, что при закрытии приложения из памяти выгружаются все объекты всех классов за исключением одного объекта нашего класса Service, грубо говоря, он как статический-неубиваемый. Точнее даже приложение наше не закрывается, а остаётся работать из-за этого одного единственного объекта типа Service, а все остальные наши Объекты, Активности, выгружаются из памяти, т.е. уничтожаются. Т.е. конкретный вопрос можно сформулировать так: при закрытии приложения, в памяти остаётся висеть только то, что было описано непосредственно в теле нашего класса Service, а всё остальное перестаёт существовать, так?
0
|
|
| 14.11.2017, 20:58 | |
|
Ответы с готовыми решениями:
6
Подробный принцип работы сканера Cобытийность. Принцип использования и принцип работы событий в jQ и GCT
|
|
Модератор
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
|
|
| 15.11.2017, 07:58 | |
|
orange_rush, открою тайну - по идее существовать будет все что не собрал сборщик мусора то есть все на что есть ссылка - сохраните в поле объекта сервиса ссылку на активити и она никуда не пропадёт - то есть на экране ее конечно не будет но зомби / утечка будут доступны
1
|
|
|
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
|
||
| 15.11.2017, 13:58 | ||
|
Что в вашем понимании закрытие приложения? Выход с последней Activity? Или смахивание в списке приложений (или нажатие кнопки стоп в настройках приложения)? Или просто сворачивание приложения, и оно там висит и его система убивает при нехватке памяти? Итак, первый вариант: вы просто вышли из последней активити. Если при выходе вы не останавливаете сервис, то он будет висеть, пока система не прибьет его по своим причинам. При убивании процесса, если у сервиса стоит флаг пересоздания, то система его заново пересоздаст с исходным bundle, который его стартовал. И сервис начнет свою работу сначала, либо (если вы это предусмотрели) продолжит работу с того момента как остановился. И еще не забывайте (или узнайте) что есть класс Application, без которого не живет ни сервис, ни activity, в нем тоже можно что-то хранить (чтоб GC его не собрала) или инициализировать.
1
|
||
| 15.11.2017, 19:02 [ТС] | ||||
|
Итак, вариант 1) "Выход из последней Активности" - это, как я понимаю, ты имеешь ввиду, полный выход, т.е. это равносильно тому, чтобы смахнуть приложение в списке Бэкстэка приложений. Т.е., тот самый момент когда выполняется метод onDestroy() для Активности, а не onStop(). Я имею ввиду именно это, когда говорю, что закрываю приложение. Вариант 2) Нажатие кнопки стоп в настройках приложения. Здесь для меня не всё так легко и просто, потому что в разных версиях Андроида это выглядит по разному. На пятом Андроиде в одном из видео уроков товарищ через настройки видел все запущенные процессы на устройстве и мог их удалять. На моём 6-м андроиде такого пункта меню нет, как у него. Тем не менее, да, для каждого приложения есть кнопка "Остановить" и что это означает, я до конца не понимаю. Либо она останавливает приложение вообще полностью во всех его проявлениях, либо останавливает приложение почти полностью, но оставляет работать Сервисы Service. Или, как раз-таки, наоборот, убивает Сервис, относящийся к приложению? Вариант 3) Мы просто свернули приложение. в данном случае я бы не рассматривал этот вариант, именно в контексте моего первоначального вопроса, чтобы в рамках данной темы хоть как-то ограничиться, дабы не развернуть здесь ВСЮ политику Андроида. Здесь как бы понятно, что Активность висит в onStop(). Тем не менее, может быть и здесь есть куда "копать", в плане возможных ситуаций, которые могут возникнуть, в том числе исключений или нехватки памяти.
0
|
||||
|
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
|
||||
| 15.11.2017, 19:59 | ||||
Сообщение было отмечено orange_rush как решение
Решение
"Выход из последней Активности" != "смахнуть приложение в списке Бэкстэка приложений"
Класс Application живет себе дальше. Это легко проверить. Создаете приложение с MainActivity и Application. Вот логи кейса: зашел в MainActivity, вышел из него, снова качал по иконке приложения: Application: onCreate() called MainActivity: onCreate() called MainActivity: onDestroy() called MainActivity: onCreate() called Как видите, нового Application: onCreate() не было, он продолжил жить и после. И еще замечание, onDestroy() у Activity не всегда выполняется, на него полагаться не стоит. Я понимаю, это все несколько сложно, но так и есть. Что могу вам посоветовать, это сделать приложение с Application, Activity, Service, там по методам жизненного цикла расставить логи и начать тестировать все варианты. На своем опыте вы быстрее поймете что к чему, а не слушать абстрактные "Если нажмем эту кнопку, то все выключится." Добавлено через 7 минут В манифесте прописываете в теге application android:name=".MyApp" Здесь один из самых тривиальных примеров, как его можно использовать.
1
|
||||
| 15.11.2017, 21:02 [ТС] | |||||||
|
Я вижу, вы мне охотно отвечаете, разрешите я немного обнаглею, и поясню, почему я изначально создал эту тему. Дело в том, что я написал вот такой код для онлайн радио (мне не сколько радио это нужно, сколько понять работу Сервиса): В классе Сервиса я решил написать следующее (пишу основное, чтобы не загромождать кодом):
На самом деле в Сервисе я прописываю ещё одно поле boolean started, которое проверяет играет радио или на паузе и по нажатию на кнопку из Активности вновь и вновь, мы то оснавливаем, то запускаем радио. При этом, постоянно, как бы, спрашиваем "если не подготовлено prepared", то подготовить - это я сделал, подразумевая, что если, допустим, прервётся связь с интернетом, то объект MediaPlayer потеряет состояние prepared и деградирует в состояние первичной инициализации. Так вот, я запускаю приложение, жму кнопку - радио играет. Потом смахиваю приложение из стека приложений и радио перестаёт играть. Вот тогда я и задумался о природе класса Service, почему и когда он "выключается".
0
|
|||||||
|
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
|
|
| 16.11.2017, 13:54 | |
|
Любой компонент не может существовать без Application. Поэтому если пересоздается сервис, то сначала создается Application, а после создается сервис. И он начинает работать с onCreate, а после вызовется onStartCommand.
Причем я раньше ошибся, когда сказал, что в него прилетит тот же самый Intent, которым мы стартовали сервис. После пересоздания Intent равен null в параметрах метода onStartCommand, если указывать START_STICKY. Если указать START_REDELIVER_INTENT, вот тогда прилетит. Но с этим флагом нужно быть осторожней, там в его описании есть интересное поведение. И там есть заметный лаг при пересоздании, он заново запускается около минуты.
2
|
|
| 16.11.2017, 13:54 | |
|
Помогаю со студенческими работами здесь
7
Android MediaPlayer без сервиса где более доступно можно почитать о импульсных БП, о принцип RESTful-сервиса с Spring for Android POST запрос
Ищу примеры создания сервиса для Android в RadStudio 10 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|