2013-04-10 3 views
1

Я все еще немного новичок в классе обслуживания Android. Я знаю, что вам нужно запустить сервис из вашего приложения с помощью startService (намерение), однако моя проблема заключается в том, что у меня есть методы внутри. Мне нужно запустить сервис с намерением, а затем создать объект этого класса в моей деятельности, чтобы я мог вызывать методы службы. Проблема в том, когда я делаю это. Я создаю один экземпляр службы, когда я запускаю ее с намерением и другим экземпляром службы, когда я создаю объект класса в своей деятельности. Это означает, что любые данные, переданные службе из startService (намерения), отсутствуют, когда я создаю объект службы. Любые способы этого или я просто злоупотребляю классом обслуживания? Я могу дать некоторый код, но в основном это:Служба Android для нескольких экземпляров

//Create Object of ControlPanel service class. 
ControlPanel cPanel = new ControlPanel(); 
//Create intent for starting ControlPanel service class 
Intent controlPanel = new Intent(this, cPanel.getClass()); 
//Start Service 
startService(controlPanel); 

ответ

7

Я бы сказал, что вы злоупотребляете классом :-).

Вызов startService() несколько раз не приводит к запуску нескольких служб.

От doc:

Просить быть запущена данная услуга приложений. Intent может либо содержать полное имя класса конкретной реализации службы для запуска, либо абстрактное определение через действие и другие поля типа службы для запуска. Если эта служба еще не запущена, она будет создана и запущена (при необходимости будет создан процесс для нее); если он запущен, он остается включенным.

Вы также должны переопределить onStartCommand(). Первый вызов startService запускает службу, если она еще не запущена. В любом случае onStartCommand перехватит любые дальнейшие вызовы startService и намерение, которое вы хотите отправить ему.

3

Любые способы обойти это или я просто полностью злоупотребляю классом обслуживания?

Вы полностью злоупотребляете классом Service.

Service используется посредством двух основных моделей:

  1. Посылка команд к нему, с помощью startService().

  2. Привязка к нему, чтобы вызвать API, выставленный этим Service, через bindService().

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

Поэтому я рекомендовал бы сначала, что вы сидите и определить полностью и точно почему вы используете Service в первую очередь. Например, ControlPanel - это имя, которое я бы связал с пользовательскими интерфейсами, а не с UI-less («фоном»). Затем и только тогда вы можете определить, подходит ли команда или шаблон привязки для вашего варианта использования.

+0

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

+0

@TravisElliott: «Любые хорошие страницы учебников, которые вы могли бы порекомендовать?» - Я уверен, что есть некоторые, но я не знаю ни малейшей возможности. Самый простой пример: https://github.com/commonsguy/cw-omnibus/tree/master/AdvServices/Binding, но он из передовой главы моей книги и поэтому предполагает опыт работы с другими вещами, такими как фрагменты. – CommonsWare

+0

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

-5

Вы можете сделать это с одним классом обслуживания.

public static int myStaticMethod(){ 
     return 1; 
    } 

Просто сделайте методы, необходимые для доступа к статическому.

+0

Я не уверен, что это отвечает на вопрос. –

+1

Он уверен, что нет. – JHH

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