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