Как очистить стек истории активности при нажатии кнопки домой? - PullRequest
7 голосов
/ 06 января 2012

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

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

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

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

Я хотел бы удалить всю цепочку действий ( A , B , C или D , E , F ) из стека истории, когда нажата кнопка «Домой», но при этом все еще остается в стеке, пока я в цепочке (я хочу иметь возможность нажать кнопку «Назад», скажем, , занятие B и переход к занятию A ).

Ответы [ 3 ]

4 голосов
/ 06 января 2012

Звучит так, как будто вам нужно использовать флаг 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);
3 голосов
/ 06 января 2012

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

Intent intent=new Intent(this, HomeClass.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
1 голос
/ 06 января 2012

Вы можете рассмотреть возможность использования только одного Activity для каждой цепочки (это будет только A и D ).

Затем реализуйте содержимое A , B и C и D , E и F как фрагменты и просто измените фрагмент, показанный на Activity при навигации назад и вперед.

Объедините это с android:noHistory, и вы получите желаемый эффект - хотя это потребует некоторого переписывания и включения пакета совместимости в ваш проект, если вы планируете использовать версию ниже Honeycomb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...