Android服务应该在MVP模式中扮演什么角色?

时间:2017-01-26 08:03:07

标签: android android-service android-mvp

我正在开发一款可以进行人类活动识别的Android应用程序。

它基本上就是这样 - 服务不断读取加速器数据并将识别的活动(即步行,运行)存储在数据库中。用户可以在ListView活动中查看所有已识别的活动(访问数据库)。数据库中的每个User表都有一个pa_goal(物理活动目标)字段,服务从数据库中读取该字段并进行一些检查。

当然,用户可以从活动中更改此目标。因为我将实现MVP架构模式。

我不确定将服务放在哪里?它肯定不是查看。有什么建议吗?

3 个答案:

答案 0 :(得分:11)

在一个干净的架构中,这就是我假设您正在使用MVP,有一种将框架与业务逻辑分离的想法。这基本上是普通演示者允许您做的事情。

在这种情况下,它不是你正在处理的观点,但原则是相似的。当您可以将它们分离出来以获得更好,更单一的责任类时,您不希望将所有业务或应用程序逻辑混合在Android代码中。所以我会说,虽然它不是一个视图,你仍然应该有一个演示者类型类(可能更好地称为控制器或管理器)。

此类将是一个POJO,它控制您的服务行为,使用标准的junit测试和服务模拟可以轻松测试。然后可以将此类和服务放入其自己的功能包中,并以与演示者相同的方式与后端模型进行交互。

因此,总而言之,该角色是您的应用的另一个功能,即网站与其他功能(根据我的经验通常只是视图)。

希望有所帮助

答案 1 :(得分:4)

这篇文章在类似的情况下帮助了我,虽然可能不完全是你的,但这个想法是一样的:

https://android.jlelse.eu/android-bound-services-and-mvp-12ca9f70c7c7

基本上,作者围绕这样一个事实,即绑定服务与活动紧密耦合,并为其添加额外的生命周期调用。

答案 2 :(得分:1)

我处于同样的境地。最后我决定做这样的事情:

活动或片段超出范围,他们对MVP一无所知但是我将使用像Otto这样的事件总线来发送信号/事件,所以:

我扩展某种Presenter的类对Android上下文一无所知,但是它们将有一个MvpView接口,只有onAttachPresenter和onDetachPresenter。

扩展Service的类将具有Presenter属性,并使用onSucess,onError,onStart,onComplete或类似的东西实现一些MvpView接口,以及Otto的相同事件(onSucessEvent,onErrorEvent,onStartEvent,onCompleteEvent)。

因此,当我需要执行某项操作时,Activity或Fragment将启动该服务,该服务将“启动”或与Presenter交谈,当演示者成功完成时将调用mvpView.onSuccess()并将信息存储在内部一个带有SQLite的本地数据库(可能是storeIO),最后服务将调用Otto并传递信号(没有任何数据),可能是onComplete。 最后,我的UI(可能是片段)将捕获信号,并在SQLite中检索数据库中的所有信息。

因此,当onSucess发生时,UI将显示最新和最佳数据但是当onError发生时将(至少)显示一些信息(或者如果你想要的话)并告诉用户“有问题,但至少你可以看到一些东西“,bot onSuccess和onError毕竟会调用onComplete。

不知道这是否是最佳解决方案,但在这种情况下,我认为我不打算处理活动或碎片生命周期,也不关心onSaveInstance并在用户旋转设备时恢复数据。它总是会获取数据库中的最新数据,如果发生了某些事情(没有互联网连接),你至少可以在收到onComplete信号时显示一些内容。

我仍在思考的一些事实:

  • 演示者不会是单身类
  • Presenter对Context不了解,但对MyApplication类
  • 一无所知
  • 如果对于一个屏幕(片段),您有不同的onSuccessEvents服务,会发生什么?只需使用某种操作作为ID即可识别它们。
  • 永远不要让Activity Fragment实现MvpView,你必须处理生命周期。