Более подробный принцип работы Сервиса Android14.11.2017, 20:58. Показов 1374. Ответов 6
Метки нет (Все метки)
Здравствуйте всем, я хочу понять, как работает Сервис Android более подробно, то о чем не показывают в видео уроках и не пишут в книгах, а если и пишут, то эту информацию не так просто найти.
В частности, объясните, кто знает такую вещь. Вот, допустим запустили мы какой-то сервис, а приложение полностью закрыли. Сервис продолжает работать. Увидеть мы это можем по существующему процессу в утилите Android Device Monitor. Но, если наш Сервис в процессе запуска и работы обращается к какому-нибудь другому нашему пользовательскому классу в нашем приложении, то по сути, при закрытии нашего приложения, из памяти выгрузятся все наши классы и Сервис уже не сможет работать (потому что обращался к одному из классов). Т.е., что я хочу подчеркнуть - то, что при закрытии приложения из памяти выгружаются все объекты всех классов за исключением одного объекта нашего класса Service, грубо говоря, он как статический-неубиваемый. Точнее даже приложение наше не закрывается, а остаётся работать из-за этого одного единственного объекта типа Service, а все остальные наши Объекты, Активности, выгружаются из памяти, т.е. уничтожаются. Т.е. конкретный вопрос можно сформулировать так: при закрытии приложения, в памяти остаётся висеть только то, что было описано непосредственно в теле нашего класса Service, а всё остальное перестаёт существовать, так?
0
|
|
| 14.11.2017, 20:58 | |
|
Ответы с готовыми решениями:
6
Подробный принцип работы сканера Cобытийность. Принцип использования и принцип работы событий в jQ и GCT
|
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
|
| 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|