Пока я имею дело с одним действием или с одним фрагментом, все в порядке.
Однако я не могу найти подходящее решение для обработки переключения активности. Скажем, ради краткого примера, что у Activity A есть кнопка для запуска Activity B.
Где будет обрабатываться функция startActivity()?
Следуя шаблону MVVM, логика clickListener должна находиться в ViewModel. Тем не менее, мы хотим избежать ссылок на деятельность в ней. Таким образом, передача контекста в ViewModel не является вариантом.
Я сузил несколько вариантов, которые кажутся "ОК", но не смог найти правильный ответ "здесь, как это сделать".
Вариант 1. Перечислите в ViewModel перечисление значений для возможной маршрутизации (ACTIVITY_B, ACTIVITY_C). Соедините это с LiveData. Эта активность будет наблюдать за этой LiveData, и когда ViewModel решит, что ACTIVITY_C должен быть запущен, это будет просто postValue (ACTIVITY_C). Затем активность может вызвать функцию startActivity().
Вариант 2: обычный шаблон интерфейса. Тот же принцип, что и вариант 1, но Activity будет реализовывать интерфейс. Я чувствую себя немного более с этим, хотя.
Вариант 3: вариант обмена сообщениями, например, Отто или аналогичный. ViewModel отправляет трансляцию, активность выбирает ее и запускает то, что ей нужно. Только проблема с этим решением заключается в том, что по умолчанию вы должны поместить регистр/регистрацию этой широковещательной передачи внутри ViewModel. Так что не помогает.
Вариант 4: наличие большого класса маршрутизации, где-то, как одиночный или похожий, который можно вызвать для отправки соответствующей маршрутизации в любую активность. В конце концов через интерфейс? Таким образом, каждое действие (или BaseActivity) будет реализовывать
IRouting { void requestLaunchActivity(ACTIVITY_B); }
Этот метод меня немного беспокоит, когда ваше приложение начинает иметь много фрагментов/действий (потому что класс Routing станет более гуманным)
Так что это. Это мой вопрос. Как вы, парни, справляетесь с этим? Вы идете с вариантом, о котором я не думал? Какой вариант вы считаете наиболее актуальным и почему? Каков рекомендуемый подход Google?
PS: Ссылки, которые меня не достали 1 - Android ViewModel вызов Способы действий 2 - Как запустить активность из простого класса непроактивности java?