Снимите флаги Intent с действия, чтобы оно возобновило исходное поведение при запуске.

В моем приложении есть активность, определенная как 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.

Заранее благодарю за любую помощь.


person Jon W    schedule 17.04.2013    source источник


Ответы (2)


Оказывается, корень моей проблемы заключался в том, что я завершал () свою корневую активность (не оставляя действий в стеке) и, таким образом, закрывал приложение, когда пользователь нажимает кнопку «Назад».

Вместо этого вызывая moveTaskToBack(true), когда они нажимают на корневую операцию, я получал согласованную функциональность «возобновления», которую я хотел, когда приложение было «повторно запущено» пользователем. И поскольку тогда я не закрывал полностью и мне приходилось заново открывать/воссоздавать приложение, я смог обойти проблему с повторным использованием Intent для действия Launcher.

person Jon W    schedule 27.04.2013
comment
Можете ли вы опубликовать мне пример этого, пожалуйста, у меня похожие проблемы. - person Guernica; 29.09.2013
comment
да, я не уверен, что вы имеете в виду. как ты этого добился? - person coolcool1994; 07.01.2014

Вы пытаетесь использовать finish(); а затем снова вызвать Activity?

person test test    schedule 17.04.2013
comment
Да. Я попытался перезапустить действие из собственного метода onNewIntent(), чтобы попытаться прикрепить новое намерение (без флага CLEAR_TOP) к действию. Итак, я заканчиваю(), начинаю активность(). onCreate вызывается снова (так что я могу сказать, что он действительно воссоздает действие, и его флаги = 0). Однако, когда я перемещаю приложение в фоновый режим, а затем перезапускаю с помощью средства запуска, ПЕРВОЕ намерение (тот, что из PendingIntent) используется, поскольку оно снова очищает верхнюю часть и имеет те же дополнительные функции, которые были переданы из уведомление PendingIntent. - person Jon W; 17.04.2013
comment
Если вы хотите перезагрузить его снова, почему бы вам не закрыть приложение, а просто переместить его в фоновый режим. Или просто используйте finish(); в каждом действии, чтобы убедиться, что при повторном запуске приложения оно загрузит первое действие. - person test test; 17.04.2013
comment
Я не хочу просто перезагружать его, я хочу очистить стек действий, поэтому я использую флаг CLEAR_TOP. Я просто хочу, чтобы после этого приложение правильно возобновляло работу при повторном запуске из списка запуска последних приложений, а не продолжало использовать намерение, в котором есть флаг CLEAR_TOP. - person Jon W; 17.04.2013