Intereting Posts
Как включить общий пункт меню в несколько меню в меню Android xml? Как открыть существующий проект в Eclipse Android 4.0.4 MediaPlayer готовят выпуск с использованием URL-адресов RTSP Android Studio 2.1 мгновенный запуск java.lang.OutOfMemoryError: превышен верхний предел GC Как прикрепить две кнопки под панелью инструментов при прокрутке Создание Deep Link для мобильного приложения Как передать значения между диалогом и активностью? Шифрование с помощью AES-256 и вектора инициализации Как вернуть результат деятельности Child в Parent в android? GCM: MulticastResult – результат из какого устройства? Только некоторые пользователи сообщают об ошибке «Ресурс не найден». Имеет ли это смысл? Установить цвет фона для панели заголовка диалога? Android: проблемы с анимацией edittext? Есть ли более простой / лучший способ поместить границу / контур вокруг моего TextView? Как я могу назвать веб-сервис с помощью phonegap для Android

Навигационная система на JellyBean?

Исходный код доступен здесь: https://github.com/novemberox/NavigationTest Это измененная версия этого примера: http://developer.android.com/training/implementing-navigation/ancestral.html

У меня три вида деятельности:

  • Main Activity только основной вход в приложение
  • Category Activity , выполняемое родителем для подробного действия
  • Detail Activity

Main Activity есть кнопка, которая открывает Category Activity и Detail Activity . Category Activty есть только одна кнопка, которая открывает Detail Activity . И, наконец, Detail Activity которая показывает некоторый текст и имеет кнопку, которая имитирует щелчок на ActionBar.

Мой путь к клику:

  • Открыть Главная Деятельность
  • Открыть Детальную деятельность
  • Нажмите кнопку «вверх»
  • Категория должна появиться
  • Back click переводит нас на главную активность с восстановленным государством

И это поток, который будет ожидаться, и он отлично работает на каждом Android до Jelly Bean (тестируется на Galaxy Nexus 4.1.1 и эмуляторе 4.2 Google exp pack). Он работает даже на ICS. Я использую поддержку lib и классы, такие как NavUtils и TaskStackBuilder, как в примере, который я указал на начало.

В JB, когда я нажимаю кнопку «вверх», он возвращается к главной операции с правильным восстановлением состояния. Я просмотрел исходный код библиотеки поддержки, и я увидел, что метод NavUtils.navigateUpTo вызывает собственный JB-код, например Activity#navigateUpTo . Я пробовал как NavUtils#navigateUpTo() и NavUtils.navigateUpFromSameTask() с тем же неудовлетворительным результатом.

У вас есть какое-то предположение, что делать, чтобы иметь этот хороший поток?

Solutions Collecting From Web of "Навигационная система на JellyBean?"

Прежде всего, если вы ориентируетесь на устройства с интерфейсом API 17 (Android 4.2), установите для targetSdkVersion значение 17 в вашем манифесте. Это не нарушает поддержку старых устройств, а просто улучшает работу устройств на новых устройствах. Конечно, это не исправить вашу проблему – это просто хорошо.

Что вы должны использовать?

Я предполагаю, что вы основываете свой код на примере предков на этой странице . Вы использовали второй пример:

 Intent upIntent = new Intent(this, MyParentActivity.class); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { // This activity is not part of the application's task, so create a new task // with a synthesized back stack. TaskStackBuilder.from(this) .addNextIntent(new Intent(this, MyGreatGrandParentActivity.class)) .addNextIntent(new Intent(this, MyGrandParentActivity.class)) .addNextIntent(upIntent) .startActivities(); finish(); } else { // This activity is part of the application's task, so simply // navigate up to the hierarchical parent activity. NavUtils.navigateUpTo(this, upIntent); } 

Однако для поведения, которое вы хотите, вам нужно будет заменить NavUtils.navigateUpTo на:

 upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(upIntent); finish(); 

Почему это работает на ICS и раньше?

В общем, библиотека поддержки пытается аппроксимировать поведение, введенное в более поздних API. В случае с NavUtils , библиотека поддержки пытается аппроксимировать bahavior, представленную в API 16 (aka Android 4.1). Для платформ pre-API 16 NavUtils использует:

 @Override public void navigateUpTo(Activity activity, Intent upIntent) { upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); activity.startActivity(upIntent); activity.finish(); } 

Это просматривает задний стек для экземпляра активности, указанной в upInent . Если он найдет один, он очистит все до него и восстановит его. В противном случае он просто запускает свою деятельность.

На платформах с более поздней версией API 16+ библиотека поддержки переносит все на собственный вызов в API Activity . Согласно документам:

Public boolean navigateUpTo (Intent upIntent)

Перейдите от этой операции к активности, указанной upIntent, завершив эту операцию в этом процессе. Если активность, указанная upIntent, уже существует в истории задачи, это действие и все остальные до указанного действия в стеке истории будут завершены.

Если указанное действие не отображается в стеке истории, это завершает каждое действие в этой задаче до тех пор, пока не будет достигнута корневая активность задачи , что приведет к поведению «в доме». Это может быть полезно в приложениях со сложной навигационной иерархией, когда активность может быть достигнута путем, не проходящим через каноническую родительскую активность.

Из этого неясно, будет ли он запускать активность, указанную в upIntent если она не находится в upIntent стеке. Чтение исходного кода также не помогает прояснить ситуацию. Однако, судя по поведению, которое показывает ваше приложение, кажется, что он не пытается запустить upIntent .

Независимо от того, какая реализация правильная или неправильная, конечным результатом является то, что вы хотите поведение FLAG_ACTIVITY_CLEAR_TOP , а не поведение native API 16. К сожалению, это означает, что вам придется дублировать аппроксимацию библиотеки поддержки.

Что правильно?

Отказ от ответственности: я не работаю для Google, так что это мое лучшее предположение.

Я предполагаю, что поведение API 16+ является предполагаемым поведением; Это встроенная реализация, которая имеет доступ к внутренним компонентам Android и может делать то, что невозможно через API. Pre-API 16, я не думаю, что можно было разматывать заднюю часть таким образом, кроме как с помощью флагов намерения. Таким образом, флаг FLAG_ACTIVITY_CLEAR_TOP является ближайшим приближением поведения API 16, доступного для платформ pre-API 16.

К сожалению, результат заключается в том, что между встроенной реализацией и реализацией библиотеки поддержки нарушается принцип наименьшего удивления в вашем сценарии. Это заставляет меня задаться вопросом, является ли это непредвиденным использованием API. Т.е., интересно, Android ожидает, что вы пройдете полный путь навигации к активности, а не прыгаете прямо к нему.

На всякий случай

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

Однако shouldUpRecreateTask основном определяет, была ли ваша активность запущена непосредственно вашим приложением (в этом случае она возвращает false ), или если она была запущена из другого приложения (в этом случае оно возвращает true ). Из этой книги библиотека поддержки проверяет, не является ли действие действия « ACTION_MAIN » не ACTION_MAIN (я не совсем понимаю это), тогда как на платформах API 16 эта проверка выполняется с ACTION_MAIN близости задачи. Тем не менее, в случае с этим приложением все работает, чтобы shouldUpRecreateTask возвращал false.