Создайте только один экземпляр службы (Android)

Как я могу убедиться, что создан только один экземпляр службы?

Я проверил некоторые функции с ведением журнала (WeatherService — это класс, расширяющий Service):

Log.i(TAG, "Start  Id:" + WeatherService.this.hashCode());
Log.i(TAG, "End Id:" + WeatherService.this.hashCode());

Он дает разные хеш-коды, даже когда я уверен, что одна и та же функция выполняется дважды (загрузка):

09-12 01:00:55.195: INFO/WeatherService(7222): Start  Id:1137653208
09-12 01:00:57.235: INFO/WeatherService(7222): Start  Id:1137654296
09-12 01:00:59.035: INFO/WeatherService(7222): Start  Id:1138806536
09-12 01:01:39.085: INFO/WeatherService(7222): End Id:1137654296
09-12 01:01:39.265: INFO/WeatherService(7222): Start  Id:1137654296
09-12 01:02:22.175: INFO/WeatherService(7222): End Id:1137653208
09-12 01:02:24.815: INFO/WeatherService(7222): End Id:1138806536
09-12 01:02:24.836: INFO/WeatherService(7222): Start  Id:1138806536
09-12 01:02:40.275: INFO/WeatherService(7222): End Id:1137654296

Я привязываю действие к службе с помощью:

bindService(new Intent(getApplicationContext(),  WeatherService.class)
                               ,mServiceConnection, BIND_AUTO_CREATE);

И служба может работать в течение нескольких минут, пока не будет завершена, поэтому служба может быть привязана к/создана многими действиями.


person Torstein I. Bø    schedule 11.09.2010    source источник
comment
Также см. эту страницу, которая, как мне кажется, также имеет полезное объяснение: the-existing-one" title=" создает ли startservice новый экземпляр службы или использует существующий"> stackoverflow.com/questions/2518238/   -  person    schedule 25.04.2013


Ответы (2)


Как я могу убедиться, что создан только один экземпляр службы?

Может быть только один экземпляр данного Service.

Он дает разные хэш-коды, даже когда я уверен, что одна и та же функция выполняется дважды (загрузка).

Тогда this не Service. Или служба была уничтожена и воссоздана между журналами.

И служба может работать в течение нескольких минут, пока не будет завершена, поэтому служба может быть привязана к/создана многими действиями.

Тогда Service, вероятно, уничтожается и создается заново. Если вам нужно, чтобы служба работала в течение нескольких минут, вам нужно использовать startService() и stopSelf() в дополнение к вашим вызовам bindService() и unbindService(). Или, возможно, вам вообще не нужно привязываться, и в этом случае вы можете рассмотреть возможность использования IntentService, так как это автоматически дает вам фоновый поток для выполнения ваших загрузок.

person CommonsWare    schedule 11.09.2010
comment
Когда задание завершено, я вызываю обратный вызов для действия, поэтому я использую bindService (используя AIDL). Теперь я попытался войти в начало и в конец, и ясно, что он не завершен/уничтожен до создания нового экземпляра. Я также использовал WeatherService.this.hashCode(), где WeatherService — это класс, расширяющий Service. - person Torstein I. Bø; 12.09.2010
comment
о, так это значит, что будет запущена только одна служба? если он будет вызван снова, oncreate не будет вызываться, а только при запуске - person Sunil Pandey; 02.05.2011
comment
Кстати, у вас есть какие-либо источники, которые поддерживают. Может быть только один экземпляр данной службы. ? - person Pacerier; 05.03.2012
comment
Я не согласен с этим ответом. Я сталкивался со случаями, когда одновременно существовало несколько сервисов с разными хэш-кодами, и все они были активны и живы. Обычно это происходит после того, как служба была развязана, а затем восстановлена, но исходная служба какое-то время продолжает существовать. Я не смог понять, как по-другому обрабатывать сценарий. - person Peter Gaultney; 14.10.2015
comment
@PeterGaultney: я сталкивался со случаями, когда одновременно существовало несколько сервисов с разными хеш-кодами, и все они активны и живы — вы можете опубликовать пример проекта, демонстрирующий такое поведение. - person CommonsWare; 14.10.2015

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

bindService(new Intent(getApplicationContext(),  WeatherService.class), mServiceConnection, BIND_AUTO_CREATE);

Попробуйте написать один раз следующим образом.

getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE);
person Hogun    schedule 22.02.2013
comment
Это было именно то, чего мне не хватало, потому что кажется, что вы МОЖЕТЕ запускать службу несколько раз (у меня была служба, которая должна была показывать тосты каждые пять секунд, и она показывала 2, 3 и больше тостов в секунду, пока я не использовал это трюк, каждый раз, когда я использовал bindService) Спасибо! - person liltof; 23.08.2015