Создать только один экземпляр Сервиса (Android) - PullRequest
31 голосов
/ 12 сентября 2010

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

Я проверил некоторые функции с журналированием (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);

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

Ответы [ 2 ]

27 голосов
/ 12 сентября 2010

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

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

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

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

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

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

8 голосов
/ 22 февраля 2013

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

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

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

getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...