В Android, как я могу определить, почему моя активность была возобновлена?

Я разрабатываю Activity, который выполняет часть своего собственного управления состоянием. Я пытаюсь различать следующие случаи onResume:

  1. Новый запуск
  2. переключатель задач (долгое нажатие кнопки «Домой»)
  3. возобновить после других действий в том же приложении
  4. пробуждение после сна
  5. изменение ориентации

Есть ли что-то в намерении Activity или где-то еще, что может помочь мне их различать?

Для любопытных и некоторого контекста... Я хотел бы сохранить свой внутренний стек истории на 4 и 5. В случаях 2 и 3 я бы сохранил ту же текущую страницу, но стер историю (разрешить нормальную функциональность кнопки «Назад» для взять на себя в этот момент). Случай 1 инициализируется внутренней стартовой страницей активности (и может быть легко обнаружен с помощью onCreate).


person Anm    schedule 24.08.2010    source источник
comment
Я полностью понимаю, что не использую стек Android Activity. Я делаю это, потому что мои страницы/внутренние действия не являются ни полноэкранными (общая панель заголовка и панель кнопок, что-то вроде макета вкладок), но все же нуждаются в анимации переходов их содержимого. Основная спецификация приложения была разработана для iPhone, и я вхожу в игру в конце игры, чтобы сделать версию для Android, включая такие вещи, как кнопка «Назад» и изменения ориентации, которые никогда не предполагались.   -  person Anm    schedule 27.08.2010
comment
Частичное решение № 4 исходит из трансляций Intent.ACTION_SCREEN_ON и ACTION_SCREEN_OFF: groups.google.com/group/android-developers/msg/   -  person Anm    schedule 26.11.2010


Ответы (1)


Есть ли что-то в намерении Activity или где-то еще, что может помочь мне их различать?

Пункт № 4 не имеет ничего общего с onResume(), насколько я знаю.

Элемент № 5 будет лучше обрабатываться через android:configChanges и onConfigurationChange(), хотя вы можете «обнаружить» его, вернув что-то из onRetainNonConfigurationInstance() и проверив, есть ли он в onResume() через getLastNonConfigurationInstance().

Остальные - не просто три случая, а, вероятно, вдвое больше, если вы начнете принимать во внимание такие вещи, как «выключение из памяти для освобождения ОЗУ» как возможность.

Навскидку кажется, что вы приняли несколько неудачных архитектурных решений («внутренний стек истории… стереть историю… позволить обычным функциям кнопки «Назад» вступить в силу в этот момент»). Android разработан для множества дешевых действий, и вы, похоже, нарушаете это правило. Вы можете сделать это, но имейте в виду, что поддержка Android для выбранного вами шаблона может быть ограничена.

person CommonsWare    schedule 24.08.2010
comment
Прежде чем читать это, я реализовал хуки onConfigurationChange(), чтобы сохранить историю изменений ориентации. Кажется, это работает. После тестирования вы, похоже, правы насчет № 4. Оставление #1 и #2, которые обрабатываются таким же образом, очищает внутренний стек истории. Что касается выталкивания из памяти, я считаю, что это допустимый случай, чтобы очистить стек истории и рассматривать новый запуск как то, что он есть, новый экземпляр приложения с пустой внутренней историей. - person Anm; 27.08.2010