我正在开发一个执行人类活动识别的 Android 应用程序。
它基本上是这样工作的——服务不断读取加速器数据并将识别的活动(即步行、跑步)存储在数据库中。用户可以在活动中看到所有已识别的ListView
活动(访问数据库)。数据库中的每个用户表都有一个 pa_goal(身体活动目标)字段,服务从数据库中读取该字段并进行一些检查。
当然,用户可以从活动中更改此目标。因为我将实现 MVP 架构模式。
我不确定将服务放在哪里?肯定不是View。有什么建议吗?
我正在开发一个执行人类活动识别的 Android 应用程序。
它基本上是这样工作的——服务不断读取加速器数据并将识别的活动(即步行、跑步)存储在数据库中。用户可以在活动中看到所有已识别的ListView
活动(访问数据库)。数据库中的每个用户表都有一个 pa_goal(身体活动目标)字段,服务从数据库中读取该字段并进行一些检查。
当然,用户可以从活动中更改此目标。因为我将实现 MVP 架构模式。
我不确定将服务放在哪里?肯定不是View。有什么建议吗?
在我假设您使用 MVP 的干净架构中,存在将框架与业务逻辑分离的想法。这基本上是普通演示者允许您做的事情。
在这种情况下,它不是您正在处理的视图,但原理是相似的。当您可以将它们分开以获得更好、更单一的职责类时,您不希望所有业务或应用程序逻辑都混合在 Android 代码中。所以我想说,虽然它不是一个视图,但你仍然应该有一个演示者类型类(可能更好地称为控制器或管理器)。
此类将是一个 POJO,它控制您的服务行为方式,可以使用标准的 junit 测试和服务模拟轻松测试。然后可以将此类和服务放入其自己的功能包中,并以与演示者相同的方式与后端模型进行交互。
因此,总而言之,该角色是您应用程序的另一个功能,该功能与其他功能(根据我的经验通常只是视图)一起站点。
希望有帮助
这篇文章在类似的情况下帮助了我,虽然可能不完全是你的,但想法是一样的:
https://android.jlelse.eu/android-bound-services-and-mvp-12ca9f70c7c7
基本上,作者解决了绑定服务与活动紧密耦合的事实,并为其添加了额外的生命周期调用。
我也有同样的情况。最后我决定做这样的事情:
活动或片段超出范围,他们对 MVP 一无所知,但我将使用像 Otto 这样的事件总线来发送信号/事件,所以:
我扩展了某种 Presenter 的类对 Android 上下文一无所知,但它们将具有 MvpView 接口,只有 onAttachPresenter 和 onDetachPresenter。
扩展 Service 的类将具有 Presenter 属性并实现一些 MvpView 接口,其中包含 onSucess、onError、onStart、onComplete 或类似的东西以及 Otto 的相同事件(onSucessEvent、onErrorEvent、onStartEvent、onCompleteEvent)。
因此,当我需要做某事时,Activity 或 Fragment 将启动服务,服务将“启动”或与 Presenter 对话,当 Presenter 成功完成时,将调用 mvpView.onSuccess() 并将信息存储在本地数据库中使用 SQLite(可能是 storeIO),最后服务将调用 Otto 并传递信号(上面没有任何数据),可能是 onComplete。最后,信号将被我的 UI(可能是片段)捕获,并在 SQLite 中检索数据库中的所有信息。
因此,当 onSucess 发生时,UI 将显示最新和最好的数据,但是当 onError 发生时(至少)会向用户显示一些信息(或者如果你愿意,不显示)告诉用户“有问题,但至少你可以看到一些东西” , bot onSuccess 和 onError 毕竟会调用 onComplete。
不知道这是否是最好的解决方案,但在这种情况下,我认为我不会处理活动或片段生命周期,并且不关心 onSaveInstance 并在用户旋转设备时恢复数据。它总是会在 DB 中获取最新数据,如果发生某些事情(没有互联网连接),您至少可以在收到 onComplete 信号时显示一些内容。
我仍在思考的一些事实: