2015-09-16 4 views
3

Я пишу приложение, которое имеет длительное обслуживание.Как убить службу Android?

Я написал некоторый код с сохранением состояния в методе onDestroy службы.

Мое намерение состоит в том, что это должно быть вызвано, если служба когда-либо была убита Android из-за давления памяти.

Как я могу имитировать обслуживание, убиваемое давлением памяти?

Я пробовал adb shell am force-stop com.example.app, но метод службы onDestroy службы не вызывался.

Является ли onDestroy разумным сайтом для обслуживания-shutdown-state-saving?

Если да, то как я могу заставить onDestroy службы вызывать Android для целей отладки/тестирования?

+0

«Как я могу имитировать обслуживание, которое убивает давление памяти?» - служба никогда не «убивается давлением памяти». Весь процесс прекращается из-за давления памяти. Независимо от того, вызывает ли это 'onDestroy()' или нет, это немного зависит от экологических соображений. «Как я могу заставить службу onDestroy вызываться Android?» - вызовите 'stopService()' из вашего тестового набора, указав «Intent», идентифицирующую вашу службу. – CommonsWare

+0

@CommonsWare «То, что вызывает триггер onDestroy() или нет, немного зависит от экологических соображений». Если 'onDestroy' не всегда вызывается, где я должен разместить код с сохранением состояния? – fadedbee

+3

«Если onDestroy не всегда называется, где я должен разместить код с сохранением состояния?» - в момент изменения состояния. – CommonsWare

ответ

4

Вы не должны полагаться на onDestroy(), так как он вызывается только при надлежащем прекращении обслуживания (путем вызова методаили stopSelf()).

Если вы хотите сохранить состояние службы, вы должны либо сохранить его, как вы идете (например, служба проигрывателя может хранить его при активации функции воспроизведения/паузы), либо использовать таймер для периодического сохранения.

Если вы хотите реагировать на события памяти, вы должны использовать класс ComponentCallbacks2, который уведомит вас, когда Android потребуется больше памяти. Если вы освободите память внутри этих обратных вызовов, вы увеличите вероятность того, что ваш сервис останется в памяти дольше.

Надеюсь, это поможет.

0

Если вы хотите программно остановить Service, в пределах Service позвоните по телефону stopSelf().

В качестве альтернативы можно перейти к настройкам приложения и остановить остановку.

+0

Извините, где находятся «настройки приложения» (Android 4.0.3) – fadedbee

+1

Как удалить приложение?Обычно есть экран, посвященный этому, и имеет опцию «FORCE STOP». – akodiakson

+0

Я использую 'adb shell pm uninstall com.example.app' или google play для удаления приложения. Я еще не видел экран, где я могу удалить приложение по телефону. – fadedbee

1

Силовая остановка не называет onDestroy на любых компонентах, ни на обслуживание, ни на деятельность. Он полностью закрывает приложение без каких-либо дополнительных соображений.

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

Смежные вопросы