В моем приложении есть активность, определенная как launchMode="singleTop", которая служит корневой активностью.
<activity
android:name="com.package.LauncherActivity"
android:launchMode="singleTop"
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Приложение создает уведомления, которые при нажатии «перезапускают» эту корневую активность, используя PendingIntent, содержащий Intent с флагом Intent.FLAG_ACTIVITY_CLEAR_TOP.
Intent newIntent = new Intent(context, LauncherActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pi = PendingIntent.getActivity(
context,
(int)System.currentTimeMillis(),
newIntent,
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
Идея состоит в том, что, где бы человек ни находился в настоящее время в приложении, когда он нажимает на уведомление, он очищает стек действий и начинает «с нуля» в этом корневом действии.
Все это работает правильно и так, как ожидалось. У меня всегда есть только одна задача, и она правильно очищает стек при выполнении уведомления PendingIntent.
Моя проблема возникает после перезагрузки одного из этих уведомлений. Если действие затем помещается в фоновый режим, а затем повторно запускается с использованием одного из различных средств запуска (Последние приложения, Настройки-> Приложения (см. Обновление ниже, не совсем) и т. д.), намерение, используемое уведомлением, используется для запустите действие включая Intent.FLAG_ACTIVITY_CLEAR_TOP.
ОБНОВЛЕНИЕ: На самом деле моя проблема связана только с попыткой вывести приложение на передний план с помощью средства запуска «Недавние приложения». Если я использую «Настройки» -> «Панель запуска приложений», он запускает приложение полностью с нуля. Тем не менее, это не «возобновление» приложения, как это было до того, как я перезаписал намерение запуска по умолчанию. Также обратите внимание, что приложение ДЕЙСТВИТЕЛЬНО возобновляет работу, как и ожидалось, если я использую возобновление Longpress-Home. Что такого особенного в средстве запуска "Последние приложения", что заставляет его повторно использовать это намерение?
Таким образом, в этот момент каждый раз, когда они возобновляют работу приложения через панель запуска, оно «очищает верхнюю часть» и начинается с самого начала, а не просто возобновляет работу приложения, как это было до того, как было использовано намерение уведомления. Это происходит из-за того, что это тот же самый экземпляр действия, и это действие продолжает запускаться с тем намерением, с которым оно было запущено. В данном случае это означает, что он каждый раз имеет флаг FLAG_ACTIVITY_CLEAR_TOP.
Этот пост в значительной степени попал в самую точку, но мой конкретная проблема не решена. В этом посте они рассказывают, как правильно игнорировать (или использовать) дополнительные функции в Bundle этого повторно используемого намерения. Но я не могу найти способ очистить флаги для этого намерения, чтобы он перестал запускаться с использованием флага CLEAR_TOP.
Я хочу, чтобы он запускался с использованием флага CLEAR_TOP только один раз, когда нажимается уведомление. Я хочу, чтобы последующие запуски приложения выполнялись так же, как и до того, как было нажато уведомление, которое просто возобновляло стек приложения/активности, где бы ни находился пользователь (вместо того, чтобы каждый раз начинать с нуля).
Я понимаю, почему действие повторно использует намерение. Мне просто нужно найти способ либо остановить его от этого, либо каким-то образом очистить флаг CLEAR_TOP от этого намерения, чтобы он вернулся к работе, как это было до того, как PendingIntent перезапустил действие с флагом FLAG_ACTIVITY_CLEAR_TOP.
Заранее благодарю за любую помощь.