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

Я пишу приложение, которое имеет два "режима"; один посмотреть режим и один редактировать режим. Приложение предоставляет два основных / запуска деятельности (скажем,A и D), которые в свою очередь имеют свои собственные цепочки операций (B, C и E, F соответственно). Два действия Точки входа A и D выставит два значка с отдельные метки на главном экране и две цепочки никогда не пересекаются, т. е. после запуска приложения в режиме просмотра с activity A, единственный маршрут, по которому вы можете ходить взад и вперед, это A, B, C и если вы запустите приложение в режиме редактирования с деятельностью D, единственная доступная цепочка действий -D, E, F.

Теперь моя проблема в том, что если запустить приложение in, например, режим просмотра (цепочка действий A, B, C) и нажмите кнопку "Домой" из любой активности в этой цепочке, я вернусь на главный экран (конечно), но если я снова запущу приложение в режиме редактирования (activity chain D, E, F) я добираюсь до активности, на которой я был при нажатии кнопки "Домой" (то есть активность в неправильной цепочке) - не ожидаемая точка входа для режима редактирования; активность D.

как мне решить эту проблему?

Я пробовал различные комбинации android:noHistory, android:clearTaskOnLaunch и другие атрибуты в AndroidManifest.xml для соответствующих видов деятельности. Но они, кажется, влияют только на саму деятельность, а не на всю цепочку.

Я хотел бы удалить всю цепочку действий (A, B, C или D, E, F) от стек истории, когда кнопка "Домой" нажата, но все еще сохраняет стек неповрежденным, пока я все еще в цепочке (я хочу иметь возможность нажать кнопку "назад", скажем, activity 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);

пожалуйста, используйте следующий метод при нажатии кнопки home:

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.