Подтвердить что ты не робот

Предотвращение множественных копий службы Android

doco для startService заявляет: "Если эта служба еще не запущена, она будет создана и запущена (при необходимости будет создан процесс для нее), если он запущен, он остается включенным". Я обнаружил, что каждый вызов startService запускает экземпляр отдельный службы, в том, что работа, выполняемая службой (в моем тестовом примере, тривиальная запись в новый файл журнала) выполняется снова для каждого вызова. Я пытаюсь обнаружить сервис, перейдя через ActivityManager... getRunningServices (Integer.MAX_VALUE)), но он не отображается. Android 2.3.3 на SGS 11 Мне что-то не хватает. Я понял, что метод service onCreate() вызывается только при его создании и что, поскольку у меня есть непрерывный процесс, выполняющийся в Сервисе (

В моей операции onResume я запускаю сервис ( "myService" ) с помощью

    Intent intent = new Intent(this, myService.class);
startService(intent);

В MyService у меня есть onCreate, например

@Override 

public void onCreate(){
    super.onCreate();
    ...

откуда я устанавливаю таймер, используя TimerTask, который записывает в файл журнала один раз/секунду.

Это работает так, как ожидалось - я вижу, как записывается журнал. В методе Activity onResume перед вызовом метода StartService я проверяю, существует ли служба myService, вызывая метод checkForRunningService, содержащий

for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
    if (service.service.getClassName().contentEquals("com.gpsanimator.startrax.myService")) {
    Toast.makeText(getApplicationContext(), "Service IS SO running: ", Toast.LENGTH_SHORT).show();
        return true;
}

Это никогда не находит службу myService, даже если она работает, так как она счастливо записывается в файл журнала.

Время Eeach, когда я возобновляю свою активность, вызывается метод onCreate моей службы myService - он генерирует новый файл журнала и начинает писать на него, а также постоянно обновляется исходный файл журнала. Не запускается ли служба при первом запуске startService? А потом продолжить? Не следует ли последующим вызовам startService() найти уже запущенную службу и, следовательно, не запускать метод onCreate() еще раз? Но это не то, что я вижу. Кажется, что каждый вызов startService() запускает метод Service onCreate().

Это явно более сложное, чем это, и я хотел бы разобраться в нем.

4b9b3361

Ответ 1

Проблема заключалась в том, что я объявил мой класс myService расширять IntentService, а не Service! Как только я исправил это, все работало в соответствии с книгой!

Ответ 2

Все зависит от того, какой метод вы вставляете.

При вызове startService только один сервис будет создан в заданное время. Если служба уже существует, она будет повторно использована. Поэтому код onCreate() вызывается только в том случае, если служба еще не существует.

Однако каждый раз, когда вы вызываете startService, код в onStartCommand() будет запускаться независимо от того, что.

Итак, да, только один экземпляр службы когда-либо существует в данный момент времени, но вызов startService может иметь эффект.

Ответ 3

IntentService останавливается немедленно (автоматически) после выполнения работы, НО, если вы запустите его снова до завершения работы, вы повторно используете существующий экземпляр службы, а onCreate не вызывается. Поэтому, пожалуйста, будьте осторожны с IntentServices.

Ответ 4

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