Альтернатива Intent.FLAG_ACTIVITY_CLEAR_TASK
У меня есть два приложения App-B запускает App-A. Если пользователь запускает приложение B изнутри приложения A, я заканчиваю на App-A, поэтому у меня нет проблем.
Если пользователь переходит прямо в приложение B из ящика приложения или долгое нажатие домашней кнопки, я реализую ниже, который сначала очищает задачу в приложении A, прежде чем применять все дополнительные функции. Это имеет желаемый аффект, но работает только с API 11. На более низких API-интерфейсах новая задача в APP-A не изменится, и дополнительные функции putExtra не будут иметь никакого эффекта. Любая альтернатива FLAG_ACTIVITY_CLEAR_TASK
? для API <= 10 <
Intent i = new Intent("com.App-A");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Спасибо
Джейсон
Ответы
Ответ 1
Новый IntentCompat должен был помочь, но, по-видимому, флаг игнорируется для API ниже 11.
Чтобы использовать IntentCompat, выполните следующие действия:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
Ответ 2
это будет работать правильно
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY |
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
Ответ 3
Лучшая документация, которую я нашел для этих флагов Intent, находится здесь: http://blog.akquinet.de/2010/04/15/android-activites-and-tasks-series-intent-flags/
Я не понимаю, что вы пытаетесь сделать, но попробовали ли вы FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
?
Ответ 4
Возможно, я ошибаюсь в понимании того, о чем вы спрашиваете, но разве при запуске B вы хотите, чтобы A был убит?
В A добавьте это в тег активности в манифесте:
android:noHistory=true
Это приведет к удалению активности из памяти, как только она потеряет фокус.
Ответ 5
У меня все еще много проблем с пониманием проблемы, но я хочу помочь вам исправить это. Поскольку комментарии допускают только 600 символов и не форматируются хорошо, я собираюсь создать ответ вместо этого, потому что я уверен, что вместе мы сможем решить эту проблему.
Я хотел бы иметь возможность воспроизвести вашу проблему. Для этого я создал 2 приложения: AppA и AppB. AppA имеет одно действие под названием ActivityA
, а AppB имеет одно действие под названием ActivityB
. Оба ActivityA
и ActivityB
используют android:launchMode="singleTask"
.
ActivityA
имеет кнопку на нем, которая запускает AppB и заканчивается, например:
Intent intent = new Intent("de.sharpmind.example.AppB");
intent.putExtra("extra", "launched from AppA");
startActivity(intent);
finish();
ActivityB
имеет кнопку на нем, которая запускает AppA следующим образом:
Intent intent = new Intent("de.sharpmind.example.AppA");
intent.putExtra("extra", "launched from AppB");
startActivity(intent);
Все это работает, как я ожидаю. AppA и AppB работают в разных задачах. "Дополнительно" правильно рассматривается в методах onCreate()
для каждого приложения.
Итак, не могли бы вы рассказать мне больше о вашей проблеме. Как я могу точно воспроизвести вашу проблему? Вы писали:
В более низких API-интерфейсах новая задача в APP-A не изменится, а extres putExtra не будет иметь эффекта.
Что вы подразумеваете под этим? Где вы размещаете дополнительные услуги, и где вы их получаете и что вы ожидаете?
Кроме того, что означает launchMode
вашего AppB
?
Кроме того, если у вас есть эта проблема, существуют ли другие действия в стеке задач для AppA?
Пожалуйста, предоставьте дополнительную информацию в исходном вопросе или здесь в качестве комментариев.
Ответ 6
Использование FLAG_ACTIVITY_CLEAR_TASK
очищает задний стек.
Если я правильно понимаю, это поведение, которое вы хотите.
Использование singleInstance
вместо singleTask
в вашем манифесте сделает это.
В комментариях вы сказали, что это должно быть singleTask
. Я предполагаю, что это связано с тем, что вам нужен задний стек при определенных обстоятельствах.
Так как launchMode
не может быть изменен программно, а FLAG_ACTIVITY_CLEAR_TASK
недоступен для API <= 10, вам может потребоваться создать два идентичных действия.
Один с launchMode=singleTask
и один с launchMode=singleInstance
.
Добавьте это к тому, используя singleInstance
, чтобы получить чистый стек при запуске из ящика приложения:
<category android:name="android.intent.category.LAUNCHER" />