IBinder
据我所知,只能通过 Activity 从 Activity 访问 ServiceMessenger
或AIDL
。
为什么服务实例的方法不能被例如活动直接调用?
例如,当服务启动时,是否让服务将其实例保存在一个单例中,然后由Activity
s 访问,允许他们直接调用服务的方法?
IBinder
据我所知,只能通过 Activity 从 Activity 访问 ServiceMessenger
或AIDL
。
为什么服务实例的方法不能被例如活动直接调用?
例如,当服务启动时,是否让服务将其实例保存在一个单例中,然后由Activity
s 访问,允许他们直接调用服务的方法?
据我所知,只能通过 IBinder、Messenger 或 AIDL 从 Activity 访问服务。
这将取决于您定义为“已访问”的内容。startService()
也可以用来指导服务执行一些操作。
为什么服务实例的方法不能被例如活动直接调用?
Android 的组件模型是围绕松散耦合和可替换实现而设计的,其中替换可能是本地的或远程的。
此外,服务只有在主动向用户交付价值时才应该运行。因此,有很多时候服务尚未运行,并且活动无论如何都需要启动或绑定到服务。
例如, anIntentService
应该只与 via 交互startService()
,因为IntentService
只有在有要处理的命令(通过提供startService()
)时才会运行。
最后,a 的主要作用Service
是作为操作系统的标记,让它知道进程仍在工作,即使它在后台也是如此。“让我们将其填充Service
到单例中”的模式表明您在所讨论的对象不一定需要是Service
. 仅仅因为一个对象是一个单例并不意味着它必须是一个Service
. 因此,您需要坐下来确保您确切地知道您Service
首先使用 a 的原因以及这是否最适合用户。
例如,当服务启动时,是否让服务将其实例保存在一个单例中,然后由 Activity 访问,允许它们直接调用服务的方法?
没有什么能阻止你这样做。我不会——我将使用startService()
和事件总线进行通信。而且,虽然在技术上可以做你想做的事,但它是否明智和可靠完全取决于服务的用例以及与该服务的通信。