Ответ 1
Проблема заключалась в том, что я объявил мой класс myService расширять IntentService, а не Service! Как только я исправил это, все работало в соответствии с книгой!
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().
Это явно более сложное, чем это, и я хотел бы разобраться в нем.
Проблема заключалась в том, что я объявил мой класс myService расширять IntentService, а не Service! Как только я исправил это, все работало в соответствии с книгой!
Все зависит от того, какой метод вы вставляете.
При вызове startService только один сервис будет создан в заданное время. Если служба уже существует, она будет повторно использована. Поэтому код onCreate() вызывается только в том случае, если служба еще не существует.
Однако каждый раз, когда вы вызываете startService, код в onStartCommand() будет запускаться независимо от того, что.
Итак, да, только один экземпляр службы когда-либо существует в данный момент времени, но вызов startService может иметь эффект.
IntentService останавливается немедленно (автоматически) после выполнения работы, НО, если вы запустите его снова до завершения работы, вы повторно используете существующий экземпляр службы, а onCreate не вызывается. Поэтому, пожалуйста, будьте осторожны с IntentServices.
Вы расширяете IntentService, который будет работать как рабочий поток. Служба запускается по мере необходимости, обрабатывает каждое намерение по очереди с помощью рабочего потока и останавливается, когда заканчивается работа. Поэтому в вашем случае ваша служба останавливается после завершения задачи, поэтому она создается несколько раз. Вы должны использовать класс сервиса и привязать его к компоненту.