我读了一些类似的问题(例如在this link),但我问的问题有点不同。事实上,在我的情况下,服务是由startService
方法手动启动的,因此无法使用bindService
方法启动它。
MainService
服务和MainServiceActivity
活动的包。在文件“AndroidManifest.xml”中,此活动通过操作MAIN
和类别LAUNCHER
进行声明。此活动用于通过SharedPreferences
配置服务,并通过调用startService
方法启动服务。换句话说,通常用户启动MainServiceActivity
并配置/启动MainService
。SecondActivity
),它是另一个包的一部分。根据配置,服务使用startActivity
方法启动此活动,因此此其他活动在与MainService
不同的进程上运行。一旦活动运行,它应该通知服务。MainService
和SecondActivity
之间的通信请求/回复开始:服务发送请求,活动发送回复。通过消息传递的通信可能适合,但MainService
是通过startService
方法启动的,因此想要绑定到服务的活动无法调用bindService
方法。 / p>
然后我有一个想法,它使用了一个额外的服务(我们称之为UtilityService
),这是MainService
的同一个包的一部分:UtilityService
可以使用bindService
方法。结果:
MainService
运行后,它可能会执行UtilityService
的绑定; MainService
启动外部活动时(例如上述SecondActivity
),此活动会绑定到UtilityService
。通过这种方式,MainService
和SecondActivity
都与UtilityService
相关联,后者充当通信中介。
这个想法有替代方案吗?
答案 0 :(得分:4)
实际上,在我的情况下,服务是由startService方法手动启动的,因此无法使用bindService方法启动它。
如果您愿意,您可以绑定并启动服务。这有点不寻常,但可以做到。
这个想法有替代方案吗?
绑定与能够与活动通信的服务没有任何关系。通过绑定使用某种回调或侦听器对象是可能的,但它远非唯一的。
你可以:
让服务发送广播Intent
,由活动选择
让活动通过PendingIntent
发送的命令createPendingResult()
额外向服务发送Intent
(例如,通过startService()
)服务使用该信息将信息发送回活动(或活动想要去的地方,例如广播)
让活动将Messenger
与其处理程序相关联的Intent
传递给通过startService()
发送的命令的{{1}}额外服务,以供服务用于发送回到活动的信息
所有这些在流程之间以及流程中都能很好地工作。
答案 1 :(得分:1)
您可以使用Android Interface Definition Language (AIDL)。
您可以找到易于使用的指南here