我进行了大量研究,但没有找到任何有用的指导或教程。唯一关于在我的应用程序架构中放置服务的提示来自@JoseAlcerreca的Medium post。
引用: “理想情况下,ViewModels不应该知道任何关于Android的事情。这可以提高可测试性、泄漏安全性和模块化程度。一个基本的经验法则是确保你的ViewModels中没有android.*导入(如android.arch.*等除外)。同样适用于presenters。”
根据这个,我应该把我的Android服务放在架构组件层次结构的顶部,与我的Activities和Fragments处于同一级别。这是因为Android服务是Android框架的一部分,所以ViewModels不应该知道它们。
现在,我将简要解释一下我的场景,但只是为了使全景更清晰,而不是因为我想得到这个特定场景的答案。
我有一个Android应用程序,其中包含许多片段的MainActivity,在BottomNavBar中全部绑定在一起。
我已经将BluetoothService绑定到了我的Activity和其中一个片段上(因为我希望服务与Activty具有相同的生命周期,但我也希望直接从我的片段与之交互)。
该片段与BluetoothService交互以获取两种类型的信息:
蓝牙连接状态的信息。不需要持久保存。
来自蓝牙设备的数据(这是一个秤,因此在这种情况下是体重和身体组成)。需要持久保存。
以下是我所能想到的三种不同的架构:
LiveData位于AndroidService内部
- 连接状态和来自蓝牙设备的重量测量数据的LiveData都在BluetoothService中。
- Fragment可以触发BluetoothService中的操作(例如扫描设备)。
- Fragment观察连接状态的LiveData,并相应地调整UI(例如,如果连接状态,则启用按钮)。
- Fragment观察新重量测量的LiveData。如果来自BluetoothDevice的新重量测量数据,则Fragment告诉自己的ViewModel保存新数据。这是通过Repository类完成的。
Fragment和AndroidService之间共享的ViewModel
- Fragment可以触发BluetoothService中的操作(例如扫描设备)。
- BluetoothService在共享ViewModel中更新与蓝牙相关的LiveData。
- Fragment在自己的ViewModel中观察LiveData。
- Fragment可以触发BluetoothService中的操作(例如扫描设备)。
- BluetoothService在自己的ViewModel中更新与蓝牙相关的LiveData。
- Fragment在自己的ViewModel和BluetoothService的ViewModel中观察LiveData。
我相信应该将它们放在架构的顶部,并像对待Activity/Fragment一样对待它们,因为BoundServices是Android框架的一部分,受Android OS管理,并绑定到其他Activities和Fragments。在这种情况下,我不知道与LiveData、ViewModels和Activities/Fragments交互的最佳方法是什么。
有些人可能认为它们应该被视为DataSource(因为在我的情况下,它使用蓝牙从称量器获取数据),但我认为这不是一个好主意,因为在上一段中所说的所有内容以及特别因为这里所说的:
避免将应用程序的入口点(例如活动、服务和广播接收器)指定为数据源。相反,它们应该只与其他组件协调,以检索与该入口点相关的数据子集。每个应用程序组件都是相当短暂的,取决于用户与其设备的交互以及系统的整体当前健康状况。
所以,最后,我的问题是:
我们应该将Android(Bound)服务放在哪里,它们与其他架构组件的关系是什么?这些替代方案中有哪些是好的方法?
LifecycleObserver
接口即可。 - Jeel Vankhede