Я много думал о том, где разместить службы Android в новой архитектуре, рекомендованной Android. Я придумал много возможных решений, но не могу определиться, какое из них лучше.
Я провел много исследований и не смог найти ни полезного руководства, ни учебника. Единственный совет, который я нашел о том, где разместить Службу в архитектуре моего приложения, - это от @JoseAlcerreca Средний пост
В идеале ViewModels не должны ничего знать об Android. Это улучшает тестируемость, безопасность от утечек и модульность. Общее практическое правило - убедиться, что в ваших ViewModels нет импорта android. * (С такими исключениями, как android.arch. *). То же самое и с ведущими.
В соответствии с этим я должен разместить свои службы Android в верхней части иерархии компонентов архитектуры, на том же уровне, что и мои действия и фрагменты. Это связано с тем, что службы Android являются частью платформы Android, поэтому ViewModels не должны о них знать.
Теперь я кратко объясню свой сценарий, но только для того, чтобы сделать панораму более четкой, а не потому, что мне нужен ответ для этого конкретного сценария.
- У меня есть приложение для Android, в котором есть MainActivity с множеством фрагментов, все они связаны вместе в BottomNavBar.
- У меня есть BluetoothService, привязанный к myActivity и одному из его фрагментов (потому что я хочу, чтобы у этой службы был тот же жизненный цикл, что и у Activty, но я также хочу взаимодействовать с ней непосредственно из моего фрагмента).
- The fragment interacts with the BluetoothService to get two types of information:
- Information about the state of the Bluetooth connection. Doesn't need to be persisted.
- Данные, поступающие с устройства Bluetooth (в данном случае это весы, то есть вес и состав тела). Необходимо настойчиво.
Вот 3 разные архитектуры, о которых я могу думать:
LiveData внутри AndroidService
- LiveData с состоянием подключения и измерениями веса, поступающими с устройства Bluetooth, находятся внутри службы Bluetooth.
- Фрагмент может запускать операции в BluetoothService (например, scanDevices)
- Фрагмент наблюдает за LiveData о состоянии подключения и соответствующим образом адаптирует пользовательский интерфейс (например, активирует кнопку, если состояние подключено).
- Фрагмент наблюдает за LiveData новых измерений веса. Если новое измерение веса поступает от BluetoothDevice, Fragment затем сообщает своей собственной ViewModel о необходимости сохранения новых данных. Это делается через класс репозитория.
Общая модель просмотра между фрагментом и AndroidService
- Фрагмент может запускать операции в BluetoothService (например, scanDevices)
- BluetoothService обновляет связанные с Bluetooth LiveData в общей ViewModel.
- Фрагмент наблюдает за LiveData в своей собственной ViewModel.
- Фрагмент может запускать операции в BluetoothService (например, scanDevices)
- BluetoothService обновляет связанные с Bluetooth LiveData в своей собственной ViewModel.
- Фрагмент наблюдает за LiveData в своей собственной ViewModel и ViewModel BluetoothService.
Я почти уверен, что мне следует разместить их поверх архитектуры и рассматривать их так же, как Activity / Fragment, потому что BoundServices являются частью Android Framework, они управляются ОС Android и привязаны к другим Activity и фрагментам. В этом случае я не знаю, как лучше всего взаимодействовать с LiveData, ViewModels и Activity / Fragments.
Кто-то может подумать, что их следует рассматривать как источник данных (поскольку в моем случае он получает данные со шкалы с помощью Bluetooth), но я не думаю, что это хорошая идея, из-за всего того, что я сказал в предыдущем абзаце. и особенно из-за того, что здесь написано:
Избегайте обозначения точек входа вашего приложения, таких как действия, службы и приемники широковещательных сообщений, в качестве источников данных. Вместо этого они должны координировать свои действия только с другими компонентами для получения подмножества данных, относящихся к этой точке входа. Каждый компонент приложения довольно недолговечен, в зависимости от взаимодействия пользователя со своим устройством и общего текущего состояния системы.
Итак, наконец, мой вопрос:
Где мы должны разместить наши (привязанные) службы Android и как они связаны с другими архитектурными компонентами? Какой из этих вариантов - хороший подход?
LifecycleObserver
интерфейс. - person Jeel Vankhede   schedule 29.11.2018