2013-02-18 2 views
2

Я ищу способ начать Android-сервис без класса. Я нашел много примеров:Запустите Android-сервис без .class

startService (новое намерение (это, TheService.class));

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

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

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

Поэтому я не могу использовать BroadcastReceiver, потому что они живут короткими. Привязка к сервису приведет к отключению, которое останавливает обслуживание (чего я не хочу).

Есть ли способ использовать старт-сервис без. Класса службы? Альтернатива: Есть ли способ привязки к сервису, который не связывает время жизни с запущенным приложением?

+0

Просто потому, что это может привести к неправильному решению дизайна: _I не может использовать BroadcastReceiver потому они живут слишком коротко, звучат так, как будто вы еще не знаете, что в течение жизненного цикла BroadcastReveivers и Services аргументация по-прежнему неправа, потому что один из них может начать долгое обслуживание через BroadcastReveiver. Кроме того, _binding_ к службе имеет, конечно, что-то общее с жизненным циклом объекта Application Activity, но временной интервал _binding_ необязательно должен соответствовать периоду _running_ службы. SO не принимают проектного решения на основе недоразумений. –

+0

Если ваш 'Сервис' хочет контролировать свою собственную жизнь, вы все равно можете это сделать, используя bind/unbind. Когда клиент связывается, «Служба» может тогда начинаться сама собой (просто вызывая 'startService()' в 'onBind()'), так что, когда клиент отключает «Сервис», он автоматически не останавливается. Затем «Сервис» может останавливаться, когда он готов к завершению. –

ответ

3

Вы можете начать его по названию. Как это:

startService(new Intent("com.whatever.servicename")); 

Вам нужно добавить фильтр намерений к APK с сервисом:

<intent-filter> 
    <action android:name="com.whatever.servicename" /> 
    </intent-filter> 
+0

Чтобы быть понятным, когда вы говорите «запустите его по имени», вы действительно имеете в виду «начать его с помощью Intent ACTION». Теоретически ваше «com.whatever.servicename» также может быть «fred-and-ethel-take-out-the-garbage» или «GobbledyGook123», хотя по соглашению ключ ACTION должен начинаться с полностью квалифицированного имени пакета, чтобы избежать конфликты. Когда вы запускаете службу с ACTION, как это, Android ищет все установленные пакеты, чтобы найти службу с фильтром Intent, который соответствует этому ACTION. –

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