Я пытаюсь выяснить, подходит ли связанный сервис для фоновой работы в моем приложении. Требования заключаются в том, что различные компоненты приложения могут делать через него веб-запросы с различным приоритетом. (Таким образом, служба должна поддерживать какую-то очередь и иметь возможность отменять текущие запросы для других с более высоким приоритетом). Я бы хотел, чтобы служба была относительно ненавязчивой для пользователя, чтобы он не обнаружил ее работающей после завершения работы с приложением. Если я хочу сделать что-то более важное, что продолжается, пока приложение закрыто, я могу использовать startForeground( ), чтобы отправить уведомление во время процесса.
Решение первое: выполнить привязку из действия
Таким образом, для данного компонента приложения он должен иметь возможность связываться со службой для выполнения работы. Но, по-видимому, существует хорошо известная проблема, заключающаяся в том, что если действие выполняет привязку, привязка будет потеряна во время изменения конфигурации (ротации), поскольку действие будет закрыто.
Итак, я подумал, что мог бы использовать другой созданный мной контекст (new Context()
) и привязать его к службе, а затем использовать фрагмент, не относящийся к пользовательскому интерфейсу, для сохранения этого контекста при изменении конфигурации, пока я не решу, что с ним покончено. Я мог сделать это только во время изменения конфигурации или как постоянную альтернативу привязке из активности. (Возможно, я должен указать, что это стандарт и рекомендуется а> способ поддерживать экземпляры при изменении конфигурации)
Решение номер 2:
Основная альтернатива, которую я вижу, заключается в том, что я могу использовать контекст приложения для выполнения привязки, но может ли это сохраняться слишком долго? и/или может быть какая-то циклическая связь между контекстом приложения и службой, что предотвращает уничтожение службы и контекста приложения?
Вопросы:
Итак, вопрос, на который я пытаюсь ответить себе: должен ли я использовать первый метод (действия с временными контекстами)? Или второй (просто привязать сервис к контексту приложения)?
Правильно ли я понимаю, что контекст приложения может связываться со службой несколько раз, а затем столько же раз от нее отвязываться? (Т.е. что у вас может быть несколько действительных привязок для PER контекста)?
Может ли использование моего собственного контекста (new Context()
) в первом решении вызвать какие-либо проблемы?
Изменить
Нашел дополнительную информацию: https://groups.google.com/forum/#!topic/android-developers/Nb58dOQ8Xfw
Также кажется, что будет сложно «создать» контекст произвольно, поэтому комбинация решений 1 и 2 кажется подходящей, когда соединение со службой сохраняется при изменении конфигурации, но привязка осуществляется к контексту приложения. Меня все еще беспокоит возможность двойной отвязки от контекста приложения. Самому вести подсчет привязок кажется ненужным - может ли кто-нибудь подтвердить/опровергнуть, что привязки относятся к соединению, а не к контексту?
service
может быть иstarted
, иbound
. Тогдаunbind
не уничтожитservice
(сама служба будет нести ответственность за вызовstopSelf
, когда решит, что задание выполнено И никакая активность не привязана к нему). - person Tomasz Gawel   schedule 27.06.2014