如何确保只创建一个服务实例?
我已经使用日志记录检查了一些函数(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);
该服务可以运行几分钟直到完成,因此该服务可以绑定到/创建许多活动
答案 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);