我个人不会使用 EventBus 来实现这一点。无论如何,这是我对您的问题的回答。
- 如果像我这样 Activity 和 Started Service 使用 EventBus 进行双向通信,那么 EventBus 监听器的代码在哪里?Presenter 在这方面没有任何作用吗?
是的,Presenter 已注册到 EventBus 以侦听传入事件并告诉视图要显示的内容。反过来,如果用户单击播放/暂停按钮,则此事件通过 Presenter 传递到您的服务(可能通过 EventBus。可能通过传递给服务的 android 意图,无论如何......但传递此事件,即通过eventbus 发生在 Presenter 中)。所以 Activity 不直接与 Service 通信。它是您的视图(活动)的演示者,它在视图(活动)和播放服务之间进行调解。
- EventBus 相关代码的代码是如何测试的——单元测试和集成测试?
您不必测试 EventBus 本身。该库的作者已经对其进行了测试。因此,将 EventBus 作为构造函数参数传递给您的 Presenter,在单元测试时,您可以将 Mocked EventBus 传递给您的 Presenter,以检查您的 Presenter 是否正确注册/取消注册,您可以启动一些事件以查看该事件是否由 Presenter 正确处理并调用视图上的预期方法(模拟视图),反之亦然,将事件(如播放/暂停)发送到服务。
- Activity 中有什么代码?服务中有什么?Presenter 与 Activity 和 Service 的合约是什么样的?最后,这个presenter的实现是怎样的?
请参阅 1 的答案。 Activity 仅显示 UI 小部件。将点击事件转发给演示者。Presenter 与 Service 通信(例如通过 EventBus)。反过来:如果你的服务改变了状态(比如到达音轨的结尾),那么它将通知 Presenter(即通过 EventBus)音频播放已经完成,并且 Presenter 告诉 View 相应地显示 UI。
- 在 MVP 的情况下,如何管理 MenuOptions 点击事件的代码?
如 1. 和 3 中所述。如果它要改变您的业务逻辑的状态(即播放/暂停),它会从您的视图(活动)通过您的 Presenter “下沉”到业务逻辑(即播放服务)。