Цель доступа, используемая для запуска действия во фрагменте - PullRequest
0 голосов
/ 20 марта 2019

У меня есть действие LauncherActivity.java, которое запускается с помощью намерения. Это намерение содержит дополнения. LauncherActivity.java анализирует эту дополнительную информацию и запускает один из нескольких фрагментов.
Сценарий примерно такой:

LauncherActicity имеет несколько фрагментов, которые действуют как страницы. Сейчас, с одной из этих страниц я запускаю иностранную деятельность. Сейчас жмем в идеале вернул бы меня к моему фрагменту в LauncherActicity, но в случае, когда LauncherActicity убит в фоновом режиме, кнопки назад будет недостаточно. Чтобы предотвратить это, всегда используя намерение вернуться к LauncherActicity будет гарантировать, что поток незатронут, даже если LauncherActicity убит в фоновом режиме.

Мое требование: я хочу получить доступ к этому намерению во фрагменте, который запускается, чтобы я мог извлечь больше информации, которая также присутствует в дополнениях намерения.

Проблема в том, что когда я делаю это, используя getActivity().getIntent(), у намерения не будет никаких дополнений, и даже действие будет нулевым. Как я могу сохранить это намерение, чтобы любой из фрагментов мог получить к нему доступ, используя getActivity().getIntent()?
Мой код не позволяет мне передавать все эти данные в конструктор или записывать данные в некоторые глобальные переменные.

EDIT
Я проверил вышеизложенное с помощью следующих шагов:

  1. Когда во внешней деятельности я принудительно остановил процесс, в котором находится LauncherActivity, а затем вызвал намерение для LauncherActivity.
  2. LauncherActivity обнаружился, как и ожидалось, и фрагмент тоже.
  3. На этот раз, когда я получил доступ к намерению из фрагмента, используя getActivity().getIntent(), намерение и все дополнительные элементы в нем были доступны во фрагменте.

НАБЛЮДЕНИЯ
Кажется, когда приложение LauncherActivity уже присутствует в backstack, намерение для этого действия вызывает onNewIntent(), тогда как, когда приложение убивается в фоновом режиме, намерение вызывает действие onCreate().
Фрагмент может получить доступ только к намерению, используя getActivity().getIntent(), которое использовалось для создания действия (то есть намерение, которое вызвало onCreate()). Остальные намерения недоступны для фрагмента.
Поскольку приложение, содержащее LauncherActivity, изначально запускается без намерения, в удачном случае все внешние намерения будут вызывать onNewIntent() и не будут доступны во фрагменте.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Возможно, я не достаточно ясно дал понять свой вопрос, но был удивлен, что не получил этот ответ:

Fragment, находящийся внутри Activity, когда звонит getActivity(), получит ссылку для этого Activity. Это означает, что вызов getActivity().getIntent() вернет намерение, которое использовалось для создания этого Activity. Если Activity получает намерение, что, пока он уже работает в backstack, это будет просто другое намерение.
Эти 2 различных вида намерений рассматриваются по-разному:

  1. Намерение, которое используется для создания Activity, вызовет его onCreate().
  2. Намерение, которое используется для вызова Activity, которое уже запущено, вызовет это onNewIntent().

Activity будет поддерживать только намерение, которое вызывает его onCreate(), а намерение, которое вызывает его onNewIntent(), будет уничтожено после того, как область действия этой функции закончится. Следовательно, чтобы сохранить намерение, полученное в onNewIntent(), нам нужно явно переопределить предыдущее намерение, которое вызвало Activity onCreate(), с помощью этого нового намерения, используя:

setIntent(intent).

0 голосов
/ 20 марта 2019

Это нарушает изоляцию фрагмента от действия.

Если вы инстанцируете свой фрагмент программно при получении намерения, вы всегда можете передать данные фрагменту через его комплект.

Иначе, вы могли бы:

...