В настоящее время я реализовал ForegroundService для поддержания жизненного цикла соединения (независимо от пользовательского интерфейса). ViewModel подписывается на потоки, предоставляемые этой службой, для наблюдения за состоянием соединения.
Моя архитектурная дилемма заключается в том, где разместить логику соединения (сканирование, подключение, обработка тайм-аута).
Текущая реализация:
Служба хранит ссылку на BluetoothRepository посредством внедрения зависимостей. Сервис активно управляет логикой сканирования и подключения с помощью сопрограмм, тогда как Репозиторий предоставляет только низкоуровневые методы.
Например, внутри Сервиса:
Код: Выделить всё
// 1. Scan logic inside Service
scanJob = serviceScope.launch {
withTimeoutOrNull(20000L) {
bluetoothRepository.getScanFlow(ScanSettings.Builder().build())
.catch { e ->
Log.e(TAG, "Scan error", e)
}
.collect { device ->
if (device == null) return@collect
Log.d(TAG, "Device scanned: ${device.name}")
updateScannedDevices(ScannedDevice(device))
}
}
// Handle timeout
updateConnectionState(BluetoothState.DisConnected)
}
// 2. Prerequisites check inside Service
val openResult = bluetoothRepository.ensureBluetoothAndLocationEnabled()
Код: Выделить всё
interface BluetoothRepository {
fun getScanFlow(settings: ScanSettings): Flow
suspend fun connectToTargetDevice(device: BluetoothDevice)
suspend fun ensureBluetoothAndLocationEnabled(): Boolean
}
1. Разделение задач: правильно ли для Службы активно координировать эти потоки (обработка таймаутов, сбор результатов и обновление собственного состояния) или этот «конечный автомат соединения» должен быть полностью инкапсулирован в репозиторий? Если Репозиторий управляет логикой, какова будет конкретная ответственность Службы?
Направление зависимости: В настоящее время Служба зависит от Репозитория (Сервис -> Репозиторий). Существует ли стандартный архитектурный шаблон, в котором репозиторий зависит от службы (или контекста) для управления соединениями BLE, учитывая, что соединение BLE должно пережить разрушение пользовательского интерфейса?
2. Поток данных: в подходе с чистой архитектурой должна ли ViewModel наблюдать за репозиторием напрямую (минуя службу), или служба действует как необходимая оболочка для обеспечения контекста фонового выполнения, требуемого BLE?
3. Я ищу ответы на основе Android лучшие архитектурные практики (чистая архитектура, примеры Google) и способы правильной обработки зависимостей жизненного цикла между BLE, службами и репозиториями.
Подробнее здесь: https://stackoverflow.com/questions/798 ... eground-se
Мобильная версия