Я много думал о том, где разместить Сервисы Android в новой Архитектуре, рекомендованной Android .Я придумал много возможных решений, но я не могу решить, какой из них лучший.
Я провел много исследований и не смог найти ни полезного руководства, ни учебника.Единственный совет, который я нашел о том, где разместить Сервис в архитектуре моего приложения, это @JoseAlcerreca Средний пост
В идеале ViewModels не должна ничего знать о Android.Это улучшает тестируемость, безопасность утечек и модульность.Общее правило заключается в том, чтобы убедиться, что в ваших моделях ViewModels нет импорта android. * (За исключением, например, android.arch. *).То же самое относится и к докладчикам.
В соответствии с этим я должен разместить свои службы Android на вершине иерархии компонентов архитектуры, на том же уровне, что и мои действия и фрагменты.Это потому, что службы Android являются частью инфраструктуры Android, поэтому ViewModels не должна знать о них.
Теперь я кратко объясню свой сценарий, но только для того, чтобы сделать панораму более четкой, а не потому, что я хочу получить ответ дляэтот конкретный сценарий.
- У меня есть приложение Android, которое имеет MainActivity со многими фрагментами в нем, все они связаны вместе в BottomNavBar.
- У меня есть BluetoothService, связанный с myActivityи один из его фрагментов (поскольку я хочу, чтобы у службы был тот же жизненный цикл, что и у Activty, но я также хочу взаимодействовать с ним напрямую из моего фрагмента).
- Фрагмент взаимодействует с BluetoothService для получения двух типовинформация:
- Информация о состоянии соединения Bluetooth.Сохранять не нужно.
- Данные, которые поступают с устройства Bluetooth (это шкала, поэтому вес и состав тела в данном случае).Необходимо сохранить.
Вот три различных архитектуры, о которых я могу подумать:
LiveData внутри AndroidService
- LiveData с состоянием соединения и измерениями веса, поступающими с устройства Bluetooth, находится внутри службы Bluetooth.
- Фрагмент может запускать операции вBluetoothService (например, scanDevices)
- Фрагмент отслеживает LiveData о состоянии соединения и соответствующим образом адаптирует пользовательский интерфейс (например, включает кнопку, если состояние подключено).
- Фрагментнаблюдает LiveData новых измерений веса.Если из BluetoothDevice приходит новое измерение веса, Fragment затем сообщает собственной ViewModel о необходимости сохранения новых данных.Это делается через класс репозитория.
Общая модель представления между фрагментом и AndroidService
- Фрагмент можеттриггерные операции в BluetoothService (например, scanDevices)
- BluetoothService обновляет связанные с Bluetooth LiveData в общей ViewModel.
- Фрагмент наблюдает LiveData в своей собственной ViewModel.
Сервис ViewModel
- Фрагмент может запускать операции в BluetoothService (например, scanDevices)
- BluetoothServiceобновляет связанные с Bluetooth LiveData в своей собственной ViewModel.
- Фрагмент наблюдает за LiveData в своих собственных ViewModel и BluetoothService ViewModel.
Я почти уверен, что я должен разместить ихна вершине архитектуры и относиться к ним как к действию / фрагменту, потому что BoundServices являются частью Android Framework, они управляютсяОС droid, и они связаны с другими Действиями и Фрагментами.В этом случае я не знаю, как лучше всего взаимодействовать с LiveData, ViewModels и Activity / Fragments.
Некоторые могут подумать, что их следует рассматривать как источник данных (так как в моем случае это получение данных из шкалы с помощью Bluetooth), но я не думаю, что это хорошая идея, из-за всего, что я сказал впредыдущий абзац и особенно из-за того, что здесь сказано :
Избегайте обозначения точек входа вашего приложения, таких как действия, сервисы и приемники вещания, какисточники данных.Вместо этого они должны координировать свои действия только с другими компонентами, чтобы получить подмножество данных, относящихся к этой точке входа.Каждый компонент приложения довольно недолговечен, в зависимости от взаимодействия пользователя с его устройством и общего текущего состояния системы.
Итак, наконец, мой вопрос:
Где мы должны разместить наши Android (связанные) сервисы и как они связаны с другими архитектурными компонентами?Является ли любая из этих альтернатив хорошим подходом?