Как очистить стек истории активности при нажатии кнопки "Домой"?

Я пишу приложение, которое имеет два "режима"; один режим просмотра и один режим редактирования. Приложение предоставляет два основных / запускающих действия (скажем, 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.

Другие вопросы по тегам