据我所知,只能通过IBinder
,Messenger
或AIDL
从活动中访问服务。
为什么服务实例的方法不能直接调用,例如,活动?
例如,当服务启动时,让服务将其实例保存在一个单例中,然后由Activity
访问,允许它们直接调用服务的方法?
答案 0 :(得分:1)
据我所知,服务只能通过IBinder,Messenger或AIDL从活动中访问。
这将取决于您定义为“已访问”的内容。 startService()
也可用于指示服务执行某些操作。
为什么服务实例的方法不能直接调用,例如,活动?
Android的组件模型是围绕松散耦合和可替换的实现而设计的,其中替换可以是本地的或远程的。
此外,a service should only be running when it is actively delivering value to the user。因此,服务尚未运行时会有很多次,并且活动无论如何都需要启动或绑定到服务。
例如,IntentService
只应与via startService()
进行互动,因为IntentService
仅在有命令(通过startService()
提供)时才会运行处理。
最后,Service
的主要作用是作为操作系统的标记,让它知道该过程仍然在工作,即使它在后台也是如此。 “允许将Service
填充到单个”中的模式表明,在有问题的对象不一定需要Service
的情况下,您正在使用该服务。仅仅因为对象是单例并不意味着它需要是Service
。因此,您需要坐下来确保您确切知道为什么首先使用Service
以及这对用户是否最佳。
例如,当服务启动时,让服务将其实例保存在一个单例中,然后由Activity访问它们,允许它们直接调用服务的方法吗?
没有什么可以阻止你这样做。我不会 - 我将使用startService()
和事件总线进行通信。而且,虽然技术上可以做你想做的事情,但是它是否合理和可靠完全取决于服务的使用情况和与该服务的通信。