如何在不同进程中实现服务和活动之间的通信?

时间:2012-04-27 22:48:09

标签: android android-service android-activity android-2.3-gingerbread

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

  1. 假设我们有一个包含MainService服务和MainServiceActivity活动的包。在文件“AndroidManifest.xml”中,此活动通过操作MAIN和类别LAUNCHER进行声明。此活动用于通过SharedPreferences配置服务,并通过调用startService方法启动服务。换句话说,通常用户启动MainServiceActivity并配置/启动MainService
  2. 现在考虑另一个活动(我们称之为SecondActivity),它是另一个包的一部分。根据配置,服务使用startActivity方法启动此活动,因此此其他活动在与MainService不同的进程上运行。一旦活动运行,它应该通知服务。
  3. 此时,MainServiceSecondActivity之间的通信请求/回复开始:服务发送请求,活动发送回复。
  4. 通过消息传递的通信可能适合,但MainService是通过startService方法启动的,因此想要绑定到服务的活动无法调用bindService方法。 / p>

    然后我有一个想法,它使用了一个额外的服务(我们称之为UtilityService),这是MainService的同一个包的一部分:UtilityService可以使用bindService方法。结果:

    • MainService运行后,它可能会执行UtilityService的绑定;
    • MainService启动外部活动时(例如上述SecondActivity),此活动会绑定到UtilityService

    通过这种方式,MainServiceSecondActivity都与UtilityService相关联,后者充当通信中介。

    这个想法有替代方案吗?

2 个答案:

答案 0 :(得分:4)

  

实际上,在我的情况下,服务是由startService方法手动启动的,因此无法使用bindService方法启动它。

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

  

这个想法有替代方案吗?

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

你可以:

  • 让服务发送广播Intent,由活动选择

  • 让活动通过PendingIntent发送的命令createPendingResult()额外向服务发送Intent(例如,通过startService())服务使用该信息将信息发送回活动(或活动想要去的地方,例如广播)

  • 让活动将Messenger与其处理程序相关联的Intent传递给通过startService()发送的命令的{{1}}额外服务,以供服务用于发送回到活动的信息

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

答案 1 :(得分:1)

您可以使用Android Interface Definition Language (AIDL)

您可以找到易于使用的指南here