33

如何确保只创建一个 Service 实例?

我已经检查了一些带有日志记录的功能(WeatherService 是扩展服务的类):

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

我将 Activity 绑定到服务:

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

并且该服务可以运行几分钟直到完成,因此该服务可以绑定到/由许多活动创建

4

2 回答 2

32

如何确保只创建一个 Service 实例?

给定的 只能有一个实例Service

即使我确定同一个函数运行了两次(下载),它也会给出不同的哈希码。

那么this就不是了Service。或者,服务已被销毁并在日志之间重新创建。

并且该服务可以运行几分钟直到完成,因此该服务可以绑定到/由许多活动创建

然后Service可能正在被破坏和重新创建。如果您需要该服务运行几分钟,您需要使用startService()andstopSelf()除了您的bindService()andunbindService()调用。或者,也许您根本不需要绑定,在这种情况下,您可能会考虑使用IntentService,因为它会自动为您提供一个后台线程来进行下载。

于 2010-09-11T22:43:29.787 回答
12

我经历过类似的情况。
如果您已编写如下,则可以在一个之上创建实例。

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

试着写一次如下。

getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE);
于 2013-02-22T09:26:24.507 回答