IntentService или как лучше разделить логику и UI?
Приветствую.
Сейчас рассматриваю и пытаюсь вывести более вменяемый патерн для разделения сервиса, логики и UI + мосты (каллбэки) между ними.
Хотел посоветоваться, что думаете над таким патерном или что можно улучшить?
1. Обработчик логики выводится в IntentService
2. В onHandleIntent вызываем/создаем нужные объекты или функции для обработки intent'а
3. Результат обработки уходит в Bundle
4. Входящий intent в onHandleIntent всегда (ну почти) имеет receiver: ResultReceiver
5. В конце обработки говорим receiver.send = RESULT_CODE с результатом обработки (Bundle)
Старт IntentService происходит через регистрацию специального action'а (где-то константа в виде String) в AndroidManifest.xml и вызова в другом месте кода startService( наш action + Intent с данными запроса + ResultReceiver опционально )
Конечно вопрос еще в том, что случится если Pause/Resume на Activity. Тут нужно что-то вроде register/unregister callback. Вчера был в Google, как раз предлагали там, завести static лист listeners, ну в общем реализовать паттерн observer, но я не сильно охотно хочу привязываться к классу сервиса.
В общем как то так, надеюсь на советы и подсказки. Уже многое перепробовал, что и пугает, должен быть ведь какой-то хороший способ, а не каждый раз выдумывать что-то новое. Спасибо.
UPD:
Обнаружил, что можно использовать UI thread Handler как мост между всей очередью Messages. Собственно создать в основном потоке Handler не проблема, а потом просто слать Message и тот Handler с Handler.Callback, который обработает message, и будет callback. Но все же я еще думаю.
Автор, я тоже это проходил. Мне хотелось, чтобы логика была за неким фасадом, и классы, её реализующие, существовали на протяжении всей работы приложения. А активити цеплялись к к ним по мере создания. Подход себя не оправдал, так как синглтоны — зло, а передача данных из сервиса осуществляется через Bundle, что вносит некоторые ограничения. А если в Bundle передавать ResponseHandler, то плодятся синглтоны…
Поэтому я сейчас использую для сложных проектов разновидность MVP, где View — xml + activity с минимальным кодом, а уже в активити создаются Presenter и Model. в презентере логика, а в модели — доступ к данным — сервисы и контент-провайдры. Фасада, как такового, нет.
Интересно. А что вы используете для callback'ов, ссылки по типу как в гугле сказали, через статик коллекцию + регистрация или очереди сообщений ( и то, тоже несколько вариантов по моему существует )? Т.к. у меня всегда какие то мелочи гадкие вылазят из-за системы общения Activity -> другой thread, где-бы он нибыл и как бы он не был реализован.