2

我读了一些类似的问题(例如在这个链接上),但我问的问题有点不同。实际上,在我的情况下,该服务是由该startService方法手动启动的,因此无法使用该bindService方法启动它。

  1. 假设我们有一个包含MainService服务和MainServiceActivity活动的包。在文件“AndroidManifest.xml”中,这个活动被声明为 actionMAIN和 category LAUNCHER。该活动用于通过 配置服务SharedPreferences并通过调用startService方法启动服务。换句话说,通常用户启动MainServiceActivity并配置/启动MainService.
  2. 现在考虑另一个活动(我们称之为SecondActivity),它是另一个包的一部分。根据配置,服务使用startActivity方法启动此活动,因此此其他活动在与MainService. 一旦活动运行,它应该通知服务。
  3. 此时,在MainService和之间开始通信请求/回复SecondActivity:服务发送请求,活动发送回复。

通过消息传递的通信可能适合,但它MainService是通过startService方法启动的,因此bindService想要绑定到服务的活动不能调用该方法。

然后我有了一个使用附加服务的想法(我们称之为它UtilityService),它是同一个包的一部分MainServiceUtilityService可以使用该bindService方法启动。作为结果:

  • 一旦MainService运行,它可能会执行绑定到UtilityService;
  • MainService启动一个外部活动(例如上面的SecondActivity)时,这个活动绑定到UtilityService.

通过这种方式,theMainService和 theSecondActivity都连接到了UtilityService,后者充当了通信的中介。

这个想法有替代方案吗?

4

2 回答 2

4

事实上,在我的例子中,该服务是通过 startService 方法手动启动的,因此无法使用 bindService 方法启动它。

如果您愿意,您可以绑定和启动服务。这有点不寻常,但可以做到。

这个想法有替代方案吗?

绑定与能够与活动通信的服务没有特别的关系。通过绑定使用某种回调或侦听器对象是一种可能性,但远非唯一。

你可以:

  • 让服务发送广播Intent,由活动接收

  • 让活动在发送 via 的命令的额外内容中向服务发送PendingIntent(例如,通过createPendingResult()),以供服务用于将信息发送回活动(或活动希望它去的任何地方,例如广播)IntentstartService()

  • 让活动在通过发送的命令的额外内容中将Messenger与其 Handler 绑定的服务传递给服务,以供服务用于将信息发送回活动IntentstartService()

所有这些在流程之间以及流程内都可以很好地工作。

于 2012-04-27T23:06:32.163 回答
1

您可以使用Android 接口定义语言 (AIDL)

您可以在此处找到易于使用的指南

于 2012-04-27T22:55:04.457 回答