2017-02-07 1 views
4

Я видел, как он упоминал в нескольких источниках, что если объект привязывает службу, он должен отменить его onDestroy. Зачем? Поскольку действие уничтожено, похоже, что служба будет все равно отключена. Если он был «запущен» - это не имеет значения. И если он был автоматически запущен деятельностью - он все равно закроется, если другие не свяжут его.Зачем отвязывать услугу onDestroy?

Так почему же отвязать его?

+0

Поддерживает ли 'Сервис', кто его ограничил? Я так не думаю. Если служба была ограничена n раз, она должна быть неограниченной примерно n раз, чтобы полностью остановиться. Итак, если вы не отвязываете, когда действие уничтожается, как теперь у службы нет активных привязок? Он будет работать в течение нескольких минут. Поправьте меня если я ошибаюсь. – azizbekian

+0

см. [Дополнительные примечания] (https://developer.android.com/guide/components/bound-services.html#Additional_Notes) – pskink

+0

@azizbekian Я предположил, что он автоматически отключается путем уничтожения связующего. Но я могу ошибаться. – ispiro

ответ

6

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

Поведение по умолчанию для деятельности переднего плана при изменении конфигурации заключается в том, что оно будет уничтожено и воссоздано.

В результате, вызов bindService() на Activity - это не очень хорошая идея. Мы хотим, чтобы привязка оставалась неповрежденной при изменении конфигурации. В противном случае наша служба будет уничтожена и воссоздана вместе с активностью (при условии, что действие имеет единственную привязку и больше ничего не запускало сервис).

Итак, рекомендуемый образец - позвонить bindService() на Application singleton. Затем вы можете передать ServiceConnection из старого экземпляра активности в новый экземпляр активности. Оставшиеся фрагменты отлично подходят для этого, так как вы можете вызвать unbindService() в onDestroy() фрагмента , так что, когда действие «постоянно» уничтожается (например, пользователь нажимает BACK, вы вызываете finish()), ваша привязка может быть освобождена.


Со всем этим в качестве фона, на ваш вопрос.

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

Что еще более важно, в большинстве случаев вызов bindService() на Activity не подходит. В противном случае вы столкнетесь с проблемами, описанными выше.

Но после созывающих bindService() -она-в- Application узора, я не ожидаю, что когда-либо быть каким-то автоматическая развязывание, потому что Application одноточечно никогда не разрушаются. Таким образом, если вы не можете позвонить unbindService() где-нибудь (например, в onDestroy() сохраненного фрагмента), вы пропустите свою службу.

+0

Если приложение не уничтожено (что может произойти, если системе нужна память и т. Д., И, пожалуйста, исправьте меня, если я ошибаюсь) то я не откажусь от службы, потому что пользователь может захотеть снова запустить Activity. Или я что-то пропустил? – ispiro

+0

@ispiro: «что может случиться, если система нуждается в памяти и т. Д., И, пожалуйста, исправьте меня, если я ошибаюсь» - Android завершит * процесс *, который устраняет все ваши объекты Java. «тогда я не хочу, чтобы служба была уничтожена», а затем используйте 'startService()' для управления временем жизни, предоставляя пользователю некоторые средства для ее остановки. «Или я что-то пропустил?» - [работает только сервис, когда он активно доставляет ценность пользователю] (https://commonsware.com/blog/2014/07/27/role-services.html). – CommonsWare

+0

@CommonsWare Спасибо. Теперь мне кажется яснее (если я правильно вас понимаю). Если мне нужно, чтобы он работал все время (например, Media Player), я действительно «начал» его и никогда не должен отвязывать его (если он больше не воспроизводится). И если мне нужно временное обслуживание, я отвяжу его, потому что это бесполезно. И в любом случае следует избегать предпосылки моего вопроса - создания службы из Деятельности. Еще раз спасибо. – ispiro