Компоненты архитектуры Android: ViewModel/Repository и привязка к Service/IntentService

Я хочу внедрить/рефакторить приложение в соответствии с концепцией компонентов архитектуры Android, см. https://developer.android.com/jetpack/docs/guide

В этом разделе Компоненты архитектуры Android ViewModel - связь с Service/IntentService я нашел очень хороший ответ на архитектурный вопрос, см. https://stackoverflow.com/a/46736146/6251815

Но я хочу спросить, как привязать сервис из репозитория, потому что у нас здесь нет ни контекста, ни активности. Чтобы было ясно, вопрос заключается в том, как объединить обе концепции.

Какова моя ситуация?

Мне нужен связанный сервис (см. https://developer.android.com/guide/components/bound-services), который предоставляется третьей стороной в виде библиотеки (давайте назовем ее «сторонний SDK»). Этот «сторонний SDK» будет выполнять некоторые асинхронные действия при подключении Bluetooth к некоторому внешнему оборудованию, поэтому он работает как более или менее постоянная фоновая служба. Однако он реализован как сервис (intentservice, поэтому активность может быть привязана к нему), и мы должны получать события, реализуя собственный интерфейс прослушивателя событий.

Что я хочу сделать?

Я также хотел бы использовать компоненты архитектуры. Я определил View и ViewModel, и я хотел бы использовать репозиторий как «Dagger2 Singleton», который предоставляет данные из локального хранилища, а также вызовы веб-служб, см. https://developer.android.com/jetpack/docs/guide#fetch-data

Мое первое намерение заключалось в том, что я мог бы обрабатывать «сторонний SDK» также как некий асинхронный квази-удаленный источник данных, и, таким образом, репозиторий также должен выполнять привязку к этому «стороннему SDK».

К сожалению, нам обычно нужен следующий код для привязки фоновой службы к активности:

Intent csIntent = new Intent(XXX, ThirdPartyService.class);
YYY.bindService(csIntent, <instance of ServiceConnection>, Context.BIND_AUTO_CREATE);

где XXX и YYY — это контекст и действие (но оба они не должны отображаться в репозитории!)

В чем проблема?

Как эта концепция привязки фоновой службы, ориентированной на действия, должна быть изменена в соответствии с https://developer.android.com/guide/components/bound-services, если я хочу получить доступ к этой фоновой службе из «репозитория архитектурных компонентов», реализованного как dagger2 @Singleton в соответствии с https://developer..android.com/jetpack/docs/guide#manage-dependencies

К сожалению, единственный полуофициальный документ, который я нашел по этой проблеме, гласит, что демонстрация «должна быть» (но тикет был закрыт): https://github.com/googlesamples/android-architecture-components/Issues/20

Спасибо за любые подсказки, как объединить обе концепции


person rico_s    schedule 02.11.2018    source источник
comment
это локальная связанная служба?   -  person pskink    schedule 02.11.2018
comment
@pskink: да .. локальная связанная служба   -  person rico_s    schedule 02.11.2018
comment
если это так, вы можете создать свои объекты LiveData там, и ваши клиенты (те, которые реализуют ServiceConnection) могут получить к ним прямой доступ   -  person pskink    schedule 02.11.2018
comment
@pskink: поскольку эта локальная связанная служба является «сторонним SDK», я не могу ее изменить, мне нужно использовать ее события через IEvenListener .. в любом случае, мне нужно как-то вообще привязать .. вопрос q о том, «как получить экземпляр'   -  person rico_s    schedule 02.11.2018
comment
честно говоря, я не понимаю: если это IntentService, то вы должны позвонить startService, не так ли? так почему он также связан? у вас есть интерфейс для этой привязки? что возвращает Service#onBind?   -  person pskink    schedule 02.11.2018
comment
@pskink: startService — это метод Context, но у меня нет Context в репозитории. Класс репозитория представляет собой аннотированный синглтон (javax.inject.singleton), который создается и может быть внедрен в ViewModels с помощью Dagger2 Dependency Injection ... таким образом, то, что я прошу, представляет собой «мост» между а) службами, определенными в Manifest.xml (IntentService), которые могут быть запущены или связаны контекстом, и б) классом, который не имеет контекста Android, но создается экземпляр/ управляемый инфраструктурой внедрения зависимостей Dagger2.. короче: я просто не могу вызвать startService внутри класса репозитория без контекста   -  person rico_s    schedule 02.11.2018
comment
Привет, @rico_s, ты смог решить эту проблему? Я борюсь с точно такой же дилеммой.   -  person Seven    schedule 20.08.2019