Создайте только один экземпляр службы (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);
И служба может работать в течение нескольких минут, пока она не будет завершена, поэтому сервис может быть привязан к/создан многими действиями
Ответы
Ответ 1
Как я могу убедиться, что создан только один экземпляр службы?
Может быть только один экземпляр заданного Service
.
Он предоставляет разные хэш-коды, даже если я уверен, что одна и та же функция работает дважды (загрузка).
Тогда this
не является Service
. Или служба была уничтожена и воссоздана между журналами.
И служба может работать в течение нескольких минут, пока она не будет завершена, поэтому служба может быть привязана к /created многими действиями
Затем Service
, вероятно, уничтожается и воссоздается. Если вам нужно, чтобы служба запускалась в течение нескольких минут, вам необходимо использовать startService()
и stopSelf()
в дополнение к вашим вызовам bindService()
и unbindService()
. Или, возможно, вам вообще не нужно связывать, и в этом случае вы можете использовать IntentService
, так как это автоматически дает вам фоновый поток для выполнения ваших загрузок.
Ответ 2
Я испытал подобную ситуацию.
Если вы были написаны следующим образом, экземпляр может быть создан за один.
bindService(new Intent(getApplicationContext(), WeatherService.class), mServiceConnection, BIND_AUTO_CREATE);
Попробуйте написать один раз следующим образом.
getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE);