Глубокая привязка Android. Намерение не сбрасывается при открытии приложения из истории

#android #android-intent

#Android #android-намерение

Вопрос:

У меня проблема с управлением задачами и намерениями Android.

Сценарий

  1. Пользователь получает толчок с глубокой ссылкой в приложение.
  2. Мы показываем уведомление, помещающее URI в данные намерения.
  3. Пользователь нажимает на уведомление, попадает в приложение и перенаправляется на некоторую Feature1Activity, описанную глубокой ссылкой.
  4. Пользователь оглядывается и выходит из приложения.
  5. Позже пользователь открывает приложение из истории (длительное нажатие кнопки home или многозадачности).
  6. Теперь для запуска приложения используется то же намерение, которое было использовано в уведомлении (с глубокой ссылкой в данных намерения).
  7. Следовательно, пользователь снова попадает в Feature1Activity.

Проблема:

Запуск приложения из истории (длительное нажатие кнопки home или многозадачности) не сбрасывает задачу (что происходит при запуске из значка приложения).

Я понимаю, что запуск приложения из истории не должен сбрасывать задачу, поскольку он предназначен для использования как «get-right-back-where-you-were». Однако в моем случае это проблема, поскольку запуск приложения из уведомления происходит один раз.

Кто-нибудь еще сталкивался с этой проблемой? Кто-нибудь знает какое-либо решение?

Более подробно

Намерение внутри PendingIntent построено следующим образом:

 Intent intent = new Intent (Intent.ActionView);
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.setData (Uri.Parse (DEEP_LINK_URL));
  

Я узнал о FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET только сегодня и действительно думал, что это избавит меня от моей проблемы, но это не имело никакого значения.

Есть три интересующих действия:

 SplashActivity       (main launcher amp; listener of the deep-linking schema -- this activity just redirects either to login or OverviewActivity)
OverviewActivity     (authorized user's main activity)
Feature1Activity     (any feature that the deep-link is pointing to)
  

Что происходит, когда пользователь нажимает на уведомление, так это то, что SplashActivity действует как прослушиватель для схемы и преобразует URL-адрес глубокой ссылки в два намерения для запуска OverviewActivity и Feature1Activity с помощью Activity.startActivities (Intent[]).

Когда я смотрю на намерение из уведомления внутри SplashActivity, оно всегда содержит глубокую ссылку в данных.

Можно обойти

Существует обходной путь, устанавливающий некоторое поле booleanExtra для намерения уведомления (например, «ignoreWhenLaunchedFromHistory» = true), а затем проверяйте SplashActivity перед перенаправлением

 boolean fromHistory = (getIntent().getFlags() amp; FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;

if (fromHistory amp;amp; getIntent().getBooleanExtra ("ignoreWhenLaunchedFromHistory", false))
    // Don't follow deep-link even if it exists
else
    // Follow deep-link
  

За исключением того, что это халтурно и некрасиво, видите ли вы какие-либо проблемы с этим обходом?

РЕДАКТИРОВАТЬ: обходной путь работает только тогда, когда я отвечаю за отправку намерения с помощью глубокой ссылки. Поскольку ни один внешний источник не может знать о дополнительном «ignoreWhenLaunchedFromHistory».

Комментарии:

1. У меня тоже есть эта проблема, и я использую то же исправление, что и вы. Вы нашли какие-либо другие решения?

2. То же самое здесь. Хотелось бы, чтобы команда Android предоставила простой способ исправить эту проблему. Это становится чрезвычайно сложным, когда вы обрабатываете несколько глубоких ссылок.

Ответ №1:

Из того, что я получаю, возможно, использование android:excludeFromRecents="true" в вашем манифесте (как свойства для объявления Activity) может улучшить проблему?