2012-01-06 3 views
7

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

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

Как это решить?

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

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

+1

Вы должны иметь глаза на это http://stackoverflow.com/questions/3473168/clear-the-entire-history-stack-and-start-a-new-activity-on-android – himanshu

+1

@dbm: ru looking fr это http://nisha113a5.blogspot.com/ ?? do revert –

+0

Привет @himanshu! Да, этот вопрос, вероятно, также привел бы меня к заключению. Спасибо за совет! – dbm

ответ

4

Похоже, что вам нужно использовать флаг Intent.FLAG_ACTIVITY_CLEAR_TOP в ваших домашних действиях, но, конечно, вы не можете добавить эти флаги в файл AndroidManifest.xml. Возможно, у вас должна быть одна точка входа, которая затем запускает правильный Activity - вы можете использовать activity-alias, чтобы сделать его похожим на две точки входа для пользователя.

Например - вы определяете деятельность в вашем файле манифеста:

<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); 
+0

Привет @Martin! Я позволил себе немного модифицировать фрагмент кода о том, как на самом деле получить метаданные, связанные с «алиасом активности». Оказалось, что он не отправляется через вызов «Intent», а скорее читается из структуры данных «ActivityInfo». – dbm

+1

Отличный ответ! Взяв объем усилий, которые вы вложили в него, и тот факт, что ваш ответ был первым (правильный и работоспособный, просто предоставил вам зеленый галочку :-) – dbm

+0

@ Мартин вы можете отредактировать свой ответ, чтобы он содержал правильное показание данные? –

3

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

Intent intent=new Intent(this, HomeClass.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 
+0

Я предполагаю, что это будет самый простой способ решить мою проблему. Тем не менее, я использую другую реализацию, которая делает это решение не подходящим для моего приложения на этот раз. Я, однако, узнал что-то по вашему ответу, и за это я благодарю вас. – dbm

1

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

Затем осуществить содержание , В и С и D, Е и F как фрагменты и просто изменить фрагмент, показанный на Activity при навигации назад и вперед.

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

+0

Это было очень изящное использование фрагментов, и поскольку мое приложение уже создано фрагментами, оно даже не было бы таким огромным переписанием. Несмотря на то, что я считаю, что это справедливо, чтобы принять ответ @Martyn, я думаю, что это архитектурный выбор, в который я поеду, в конце концов. Спасибо за отличную идею! – dbm

Смежные вопросы