Как очистить стек истории активности при нажатии кнопки "Домой"?
Я пишу приложение, которое имеет два "режима"; один режим просмотра и один режим редактирования. Приложение предоставляет два основных / запускающих действия (скажем, A и D), которые, в свою очередь, имеют свои собственные цепочки действий (B, C и E, F соответственно). В двух действиях точки входа A и D на главном экране будут отображаться две иконки с разными надписями, и эти две цепочки никогда не пересекаются, т. Е. После запуска приложения в режиме просмотра с действием A единственный путь, по которому можно идти назад и вперед это A, B, C, и если вы запускаете приложение в режиме редактирования с действием D, единственной доступной цепочкой действий является D, E, F.
Теперь моя проблема заключается в том, что если запустить приложение, например, в режиме просмотра (цепочка действий A, B, C) и нажать кнопку "Домой" из любого занятия в этой цепочке, я вернусь на главный экран (конечно), но если я тогда перезапустить приложение в режиме редактирования (цепочка действий D, E, F). Я получаю информацию об активности, в которой я находился, когда нажимал кнопку "Домой" (то есть операция в неправильной цепочке), а не ожидаемая точка входа для режима редактирования.; деятельность D.
Как мне это решить?
Я пробовал различные комбинации android:noHistory
, android:clearTaskOnLaunch
и другие атрибуты в AndroidManifest.xml
для вовлеченных действий. Но они, похоже, влияют только на саму деятельность, а не на всю цепочку.
Я хотел бы удалить всю цепочку действий (A, B, C или D, E, F) из стека истории, когда нажата кнопка "Домой", но при этом сохранить стек в неизменном состоянии, пока я в цепочке (я хочу чтобы иметь возможность нажать кнопку "назад", скажем, из занятия B и перейти к занятию A).
3 ответа
Похоже, вам нужно использовать Intent.FLAG_ACTIVITY_CLEAR_TOP
пометьте свои домашние действия, но, конечно, вы не можете добавить эти флаги в файл AndroidManifest.xml. Может быть, у вас должна быть единственная точка входа, которая затем запускает правильную Activity
- вы можете использовать псевдоним активности, чтобы он выглядел как две точки входа для пользователя.
Например - вы определяете действия в вашем файле манифеста:
<activity-alias
android:label="@string/edit_app_name"
android:name="launch_edit"
android:targetActivity=".activities.LaunchActivity">
<meta-data android:name="launch_type" android:resource="@string/launch_edit" />
</activity-alias>
<activity-alias
android:label="@string/view_app_name"
android:name="launch_view"
android:targetActivity=".activities.LaunchActivity">
<meta-data android:name="launch_type" android:resource="@string/launch_view" />
</activity-alias>
Тогда в вашей LaunchActivity у вас есть:
ActivityInfo activityInfo = getPackageManager().getPackageInfo( this.getComponentName(), PackageManager.GET_ACTIVITIES|PackageManager.GET_META_DATA);
int launchTypeResource = activityInfo.metaData.getInt("launch_type");
String launchType = context.getString(launchTypeResource);
if(launchType == null) {
// handle error
throw new Exception();
}
Intent newIntent;
if(launchType.equals(context.getString(R.string.launch_view)) {
newIntent = createIntent(ViewActivity.class);
} else if(launchType.equals(context.getString(R.string.launch_edit)) {
newIntent = createIntent(EditActivity.class);
}
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(newIntent);
Пожалуйста, используйте следующий метод при нажатии кнопки домой:
Intent intent=new Intent(this, HomeClass.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Вы можете рассмотреть возможность использования только одного Activity
для каждой цепи (это были бы только A и D).
Затем реализуйте содержимое A, B и C и D, E и F как фрагменты и просто измените фрагмент, показанный на Activity
при навигации назад и вперед.
Объедините это с android:noHistory
и вы должны получить желаемый эффект - хотя это потребует некоторой переписки и включения пакета совместимости в ваш проект, если вы планируете использовать версию ниже Honeycomb.