Да, но если вы начинаете свою деятельность с использованием этого контекста, вам нужно установить для флага NEW_TASK значение намерения, и это просто грязно. Контекст приложения не должен использоваться для запуска действий.

но я решил поближе познакомиться с новыми компонентами архитектуры Android, которые выпустила Google, особенно с использованием их класса ViewModel, учитывающего жизненный цикл, для архитектуры MVVM и LiveData.

Пока я имею дело с одним действием или одним фрагментом, все в порядке.

Тем не менее, я не могу найти хорошее решение для переключения активности. Скажем ради краткого примера, что у Действия A есть кнопка для запуска Действия B.

Где будет обрабатываться startActivity ()?

Следуя шаблону MVVM, логика clickListener должна быть в ViewModel. Тем не менее, мы хотим избежать ссылок на активность. Поэтому передача контекста в ViewModel не вариант.

Я сузил пару вариантов, которые кажутся «ОК», но не смог найти правильного ответа «вот как это сделать».

Опция 1 : Иметь перечисление во ViewModel со значениями, отображающими возможную маршрутизацию (ACTIVITY_B, ACTIVITY_C). Соедините это с LiveData. Операция будет наблюдать эти LiveData, и когда ViewModel решит, что ACTIVITY_C должен быть запущен, он просто отправит значение (ACTIVITY_C). Затем активность может вызывать startActivity () в обычном режиме.

Вариант 2 : Обычный шаблон интерфейса. Тот же принцип, что и в варианте 1, но Activity будет реализовывать интерфейс. Я чувствую немного больше связи с этим, хотя.

Вариант 3 : Опция обмена сообщениями, например Otto или аналогичная. ViewModel отправляет широковещательную рассылку, Activity забирает ее и запускает то, что нужно. Единственная проблема с этим решением состоит в том, что по умолчанию вы должны поместить регистр / отмену регистрации этой трансляции в ViewModel. Так что не помогает.

Вариант 4 : Наличие большого класса Routing, где-нибудь, в виде синглтона или аналога, который может быть вызван для отправки соответствующей маршрутизации на любое действие. В конце концов через интерфейс? Таким образом, каждое действие (или BaseActivity) будет реализовывать

IRouting { void requestLaunchActivity(ACTIVITY_B); }

Этот метод меня немного беспокоит, когда в вашем приложении появляется много фрагментов / действий (потому что класс Routing станет огромным)

Ну это все. Это мой вопрос. Как вы, ребята, справляетесь с этим? Вы идете с опцией, о которой я не думал? Какой вариант вы считаете наиболее актуальным и почему? Каков рекомендуемый подход Google?

PS: ссылки, которые меня нигде не получили 1 -Android ViewModel вызов методов деятельности 2 -Как начать деятельность с простого неактивного Java-класса?

Ответы на вопрос(2)

Ваш ответ на вопрос