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

Tor*_* Bø 33 android android-service

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

我已经使用日志记录检查了一些函数(WeatherService是扩展Service的类):

Log.i(TAG, "Start  Id:" + WeatherService.this.hashCode());
Log.i(TAG, "End Id:" + WeatherService.this.hashCode());
Run Code Online (Sandbox Code Playgroud)

即使我确定相同的函数运行两次(下载),它也会提供不同的哈希码:

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
Run Code Online (Sandbox Code Playgroud)

我将Activity绑定到服务:

bindService(new Intent(getApplicationContext(),  WeatherService.class)
                               ,mServiceConnection, BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)

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

Com*_*are 31

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

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

即使我确定相同的函数运行两次(下载),它也会提供不同的哈希码.

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

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

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

  • 顺便说一句,你有任何支持"只能有一个给定服务的实例"的来源.? (7认同)
  • 我不同意这个答案.我遇到过同时存在多个具有不同哈希码的服务的情况,并且所有这些服务都是活动的和活动的.它通常发生在服务未绑定然后反弹之后,但原始服务似乎会持续一段时间.我一直无法弄清楚如何以不同的方式处理场景. (4认同)

Hog*_*gun 8

我经历过类似的情况.
如果您已编写如下,则可以创建实例.

bindService(new Intent(getApplicationContext(),  WeatherService.class), mServiceConnection, BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)

尝试写一次如下.

getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)