Запуск служб Android по намерению или по созданию экземпляра - PullRequest
2 голосов
/ 26 января 2012

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

MyService mse = new MyService();

Тем не менее, в образце биллинга Google в приложении это именно то, что они делают в Dungeons.java, строка 235. Так что это очевидно законно.

Мне интересно, если я запущу такой сервис, узнает ли фреймворк, что он работает? Другими словами, если позже я попытаюсь вызвать startService () для той же службы, распознает ли платформа, что экземпляр службы уже существует, и отправит вызовы startService () к нему?

Ответы [ 2 ]

1 голос
/ 13 января 2017

Я не знаю, на какой пример вы ссылаетесь.Но вы абсолютно точно не можете создать экземпляр компонента Android (Activity, BroadcastReceiver, Service, Provider) самостоятельно, используя ключевое слово new.Эти компоненты могут быть созданы только в платформе Android, так как фреймворк должен установить Context компонента.

(к сожалению) ничто не мешает вам написать Service s = new MyService();, но это подойдетты ничего хорошего.Android никогда не будет вызывать какие-либо методы жизненного цикла для этого Service, и любые вызовы, которые вы делаете к методам Service, вероятно, будут неэффективными, потому что у экземпляра нет Context.

0 голосов
/ 26 января 2012

Если вы создаете экземпляр службы напрямую, а не используете намерения, которые гарантируют, что служба будет работать в процессе вашей деятельности. Если эта активность должна быть убита, то и сервис тоже отключается. Это плохая практика? Ну, это зависит от того, что вы хотели. Если вам нужен этот сервис, чтобы пережить потенциальные остановки деятельности, то да, это плохая вещь. Если вам все равно, или ваше приложение может выдержать эти отключения, тогда все в порядке. Тем не менее, я бы поспорил, если вам нужно запустить фоновое задание, которое можно остановить, когда ваша активность остановится, тогда вам нужно использовать AsyncTask, а НЕ службу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...