【问题标题】:Create only one instance of Service (Android)仅创建一个 Service 实例 (Android)
【发布时间】:2010-09-11 22:27:14
【问题描述】:

如何确保只创建一个 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);

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

【问题讨论】:

标签: android android-service


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 当工作完成后,我会调用活动回调,这就是我使用 bindService(使用 AIDL)的原因。我现在尝试在开始和结束时记录,很明显在创建新实例之前它没有完成/销毁。我还使用了 WeatherService.this.hashCode(),其中 WeatherService 是扩展 Service 的类。
  • 哦,所以这意味着它只会启动一项服务?如果再次调用 oncreate 则不会调用,而只会调用 onstart
  • 顺便说一句,您是否有任何支持“给定服务只能有一个实例”的资源。 ?
  • 我不同意这个答案。我遇到过同时存在多个具有不同哈希码的服务的情况,并且它们都处于活动状态。它通常发生在服务解除绑定然后反弹之后,但原始服务似乎存在一段时间。我一直无法弄清楚如何以不同的方式处理这种情况。
  • @PeterGaultney:“我遇到过同时存在多个具有不同哈希码的服务的情况,并且它们都处于活动状态” - 欢迎您发布示例项目来演示这一点行为。
【解决方案2】:

我也遇到过类似的情况。
如果你写成如下,实例可以在一个之上创建。

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

尝试如下写一次。

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

【讨论】:

  • 这正是我所缺少的,因为,您似乎可以多次启动服务(我有一个服务应该每五秒显示一次祝酒词,它显示 2、3 和在我使用这个技巧之前,我每次使用 bindService 时都要多烤一秒钟)谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
相关资源
最近更新 更多