仅创建一个服务实例(Android)

时间:2010-09-11 22:27:14

标签: android android-service

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

我已经使用日志记录检查了一些函数(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

我使用以下命令将Activity绑定到服务:

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

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

2 个答案:

答案 0 :(得分:28)

  

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

只能有一个给定Service的实例。

  

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

然后this不是Service。或者,该服务已被破坏并在日志之间重新创建。

  

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

然后Service可能正在被销毁并重新创建。如果您需要将服务运行几分钟,则除了startService()stopSelf()来电之外,您还需要使用bindService()unbindService()。或者,您可能根本不需要绑定,在这种情况下,您可能会考虑使用IntentService,因为这会自动为您提供一个后台线程来进行下载。

答案 1 :(得分:9)

我遇到过类似的情况 如果您编写如下,则可以创建一个实例。

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

尝试按如下方式编写一次。

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