2010-09-11 106 views
29

如何确保只创建一个服务实例?仅创建一个服务实例(Android)

我也查了一些功能与日志(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 

我一个活动绑定到服务提供:

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

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

+0

也看到这个页面,我觉得有一个有用的解释,以及:http://stackoverflow.com/questions/2518238/does-startservice-create-a-new-service-instance-or-使用现有的一个 – 2013-04-25 13:37:10

回答

27

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

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

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

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

,直到它完成该服务可以为分钟运行一次,因此该服务可以通过很多活动

然后Service可能正在破坏并重新创建绑定到/创建 。如果您需要该服务运行几分钟,除了呼叫bindService()unbindService()之外,还需要使用startService()stopSelf()。或者,也许根本不需要绑定,在这种情况下,您可能会考虑使用IntentService,因为这会自动为您提供一个后台线程,用于执行下载。

+0

感谢您的信息! – Wroclai 2010-09-11 22:44:56

+0

当作业完成后,我调用回调函数,这就是为什么我使用bindService(使用AIDL)的原因。我现在已经尝试在开始和结束时进行登录,并且很明显,在创建新实例之前它没有完成/销毁。我还使用了WeatherService.this.hashCode(),其中WeatherService是扩展Service的类。 – 2010-09-11 22:54:38

+0

哦,这意味着它只有一个服务将开始?如果它再次召回oncreate不会被打电话,但只有onstart – 2011-05-02 11:26:02

8

我经历过类似的情况。
如果您已按照以下方式编写,则可以创建一个实例。

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

试着写一次如下。

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

这正是我想念的东西,因为,看起来你可以多次启动一项服务(我有一个服务器应该每隔5秒显示一次敬酒,并且它显示了2次,3次以及更多次烤面包,直到我用了这个技巧,每次我使用bindService)谢谢! – liltof 2015-08-23 16:02:26