Разница между onStart() и onResume()
Я не могу понять значение состояния перехода onStart()
. Метод onResume()
всегда вызывается после onStart()
. Почему не может быть onResume()
вызывается после onRestart()
и onCreate()
методов, исключающих onStart()
? Какова его цель?
Почему мы не можем жить без onStart()
. Я все еще считаю его избыточным (возможно, потому, что не понимаю его смысла полностью).
Ответы
Ответ 1
Почему он не может быть вызван onResume() после методов onRestart() и onCreate(), исключающих onStart()? Какова его цель?
ОК, так как мой первый ответ был довольно длинным, я не буду расширять его дальше, поэтому попробуйте это...
public DriveToWorkActivity extends Activity
implements onReachedGroceryStoreListener {
}
public GroceryStoreActivity extends Activity {}
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Я сознательно не обращал внимания на такие вещи, как super.onCreate(...)
и т.д. Это псевдокод, поэтому дайте мне художественную лицензию здесь.;)
Методы для DriveToWorkActivity
следуют...
protected void onCreate(...) {
openGarageDoor();
unlockCarAndGetIn();
closeCarDoorAndPutOnSeatBelt();
putKeyInIgnition();
}
protected void onStart() {
startEngine();
changeRadioStation();
switchOnLightsIfNeeded();
switchOnWipersIfNeeded();
}
protected void onResume() {
applyFootbrake();
releaseHandbrake();
putCarInGear();
drive();
}
protected void onPause() {
putCarInNeutral();
applyHandbrake();
}
protected void onStop() {
switchEveryThingOff();
turnOffEngine();
removeSeatBeltAndGetOutOfCar();
lockCar();
}
protected void onDestroy() {
enterOfficeBuilding();
}
protected void onReachedGroceryStore(...) {
Intent i = new Intent(ACTION_GET_GROCERIES, ..., this, GroceryStoreActivity.class);
}
protected void onRestart() {
unlockCarAndGetIn();
closeDoorAndPutOnSeatBelt();
putKeyInIgnition();
}
ОК, так что это еще один длинный (извините, народ). Но вот мое объяснение...
onResume()
- это когда я начинаю ездить, а onPause()
- когда я нахожусь на временной остановке. Поэтому я еду, затем добираюсь до красного света, поэтому я останавливаюсь... свет гаснет, и я возобновляю. Еще один красный свет, и я останавливаюсь, затем зеленый, чтобы возобновить. Цикл onPause() -> onResume() -> onPause() -> onResume()
является плотным и происходит много раз в моем путешествии.
Повторение цикла от повторного запуска (подготовка к продолжению моего путешествия) для запуска снова возможно менее распространено. В одном случае я вижу Продуктовый магазин и запускается GroceryStoreActivity
(заставляя мой DriveToWorkActivity
до пункта onStop()
). Когда я вернусь из магазина, я прохожу через onRestart()
и onStart()
, а затем возобновляю свое путешествие.
Я мог бы поместить код в onStart()
в оба onCreate()
и onRestart()
и не беспокоить переопределять onStart()
вообще, но чем больше это нужно сделать между onCreate() -> onResume()
и onRestart() -> onResume()
, больше я дублирую вещи.
Итак, для повторного запроса...
Почему он не может быть вызван onResume() после того, как методы onRestart() и onCreate() просто исключают onStart()?
Если вы не переопределяете onStart()
, тогда это действительно то, что происходит. Хотя метод onStart()
Activity
будет называться неявно, эффект в вашем коде эффективно onCreate() -> onResume()
или onRestart() -> onResume()
.
Ответ 2
Короткий ответ:
Мы не можем жить без onStart, потому что это состояние, когда действие становится "видимым" для пользователя, но пользователь не может "взаимодействовать" с ним, но может быть причиной того, что он перекрывается каким-то другим небольшим диалогом. Эта способность взаимодействовать с пользователем - это та, которая отличает onStart и onResume. Подумайте об этом как о человеке за стеклянной дверью. Вы можете видеть человека, но вы не можете взаимодействовать (разговаривать/слушать/пожимать руки) с ним. OnResume подобен открывателю дверей, после которого вы можете начать взаимодействие.
Дополнительно onRestart() является наименее понятным. Мы можем задать вопрос о том, почему бы не перейти непосредственно к onStart() или onResume() после onStop() вместо onRestart().
Легче понять, заметим, что onRestart() частично эквивалентен onCreate(), если часть создания опущена. В основном оба состояния приводят к onStart() (т.е. Активность становится видимой). Поэтому оба государства должны "подготовить" материал, который будет отображаться. OnCreate несет дополнительную ответственность за "создание" отображаемого материала.
Таким образом, их структуры кода могут подходить к чему-то вроде:
onCreate()
{
createNecessaryObjects();
prepareObjectsForDisplay();
}
onRestart()
{
prepareObjectsForDisplay();
}
Вся путаница вызвана тем, что Google выбрал неинтуитивные имена вместо следующего:
onCreateAndPrepareToDisplay() [instead of onCreate() ]
onPrepareToDisplay() [instead of onRestart() ]
onVisible() [instead of onStart() ]
onBeginInteraction() [instead of onResume() ]
onPauseInteraction() [instead of onPause() ]
onInvisible() [instead of onStop]
onDestroy() [no change]
Диаграмма активности может быть интерпретирована как:
![Android Activity Lifecycle]()
Ответ 3
onStart()
, когда активность становится видимой для пользователя.
onResume()
, когда действие начнет взаимодействовать с пользователем.
В этом случае вы можете делать разные вещи.
См. эту ссылку для справки.
Ответ 4
onResume()
вызывается:
- после
onStart()
- когда на передний план выходит
Activity
.
От http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle:
![alt text]()
Ответ 5
Книга "Привет, Android, представляя платформу Google Mobile Development Platform" дает хорошее объяснение жизненного цикла приложений для Android. К счастью, у них есть отдельная глава онлайн в виде выдержки. См. Рисунок на стр. 39 в
http://media.pragprog.com/titles/eband3/concepts.pdf
Кстати, эта книга очень рекомендуется для начинающих Android!
Ответ 6
Особенно лихорадочным является пример, когда вы решили показать управляемый диалог из Activity с помощью showDialog()
. Если пользователь поворачивает экран, пока диалог все еще открыт (мы называем это "конфигурационным изменением" ), тогда основное действие будет проходить через все завершающие вызовы жизненного цикла до onDestroy()
, будет воссоздаваться и возвращаться жизненные циклы. Однако вы не можете ожидать, что onCreateDialog()
и onPrepareDialog()
(методы, вызываемые при выполнении showDialog()
и теперь автоматически автоматически для воссоздания диалога - автоматически, поскольку это управляемый диалог) называются между onStart()
и onResume()
. Путь здесь заключается в том, что диалог не охватывает весь экран и, следовательно, оставляет часть основного видения видимым. Это деталь, но это имеет значение!
Ответ 7
onStart()
- Вызывается после onCreate (Bundle) или после onRestart(), за которым следует
onResume().
- вы можете зарегистрировать BroadcastReceiver в
onStart()
для мониторинга изменений
которые влияют на ваш пользовательский интерфейс, вы должны отменить его в onStop()
- Производные классы должны обращаться к классу суперкласса
реализация этого метода. Если они этого не сделают, исключение будет
выброшены.
onResume()
- Вызывается после onRestoreInstanceState (Bundle), onRestart() или OnPause()
- Начать анимацию, открыть устройства с эксклюзивным доступом (например, камеру).
onStart()
обычно отправляют работу в фоновый поток, возвращающие значения которого:
-
START_STICKY, чтобы автоматически перезапустить, если он был убит, чтобы поддерживать его.
-
START_REDELIVER_INTENT
для автоматического перезапуска и повторной попытки, если служба была убита до stopSelf().
onResume()
вызывается ОС после того, как устройство переходит в спящий режим или после того, как предупреждение или другое дочернее действие с частичным экраном оставляет часть предыдущего окна видимой, поэтому необходимо повторно использовать метод -инициализация полей (внутри структуры try с уловкой исключений).
Такая ситуация не вызывает вызов onStop()
, когда ребенок закрывается.
onResume()
вызывается без onStart()
, когда активность возобновляется с фона
Для получения дополнительной информации вы можете посетить Android_activity_lifecycle_gotcha И Жизненный цикл деятельности
Ответ 8
onStart()
означает Activity
, введенный в видимое состояние, и макет создается, но не может взаимодействовать с этим макетом действий.
Resume()
означает, что теперь вы можете взаимодействовать с макетом действий.
Ответ 9
Обратите внимание, что между вызовами onStart() и onResume() происходят вещи. А именно, onNewIntent(), который я болезненно узнал.
Если вы используете флаг SINGLE_TOP, и вы отправляете некоторые данные в свою деятельность, используя дополнительные намерения, вы сможете получить к нему доступ только в onNewIntent(), который называется после onStart (< ) и до onResume(). Как правило, вы берете новые (возможно, только измененные) данные из дополнительных функций и устанавливаете их для некоторых членов класса или используете setIntent(), чтобы установить новое намерение как исходное намерение деятельности и обработать данные в onResume().
Ответ 10
Ссылка на http://developer.android.com/training/basics/activity-lifecycle/starting.html
onResume()
Вызывается непосредственно перед началом взаимодействия с пользователем. На этом этапе активность находится в верхней части стека активности, при этом пользовательский ввод переходит к ней.
Всегда следует onPause()
.
onPause()
Вызывается, когда система вот-вот начнет возобновление другого действия. Этот метод обычно используется для переноса несохраненных изменений в постоянные данные, остановки анимаций и других вещей, которые могут потреблять процессор, и так далее. Он должен делать все, что он делает очень быстро, потому что следующее действие не будет возобновлено до тех пор, пока оно не вернется.
За ним следует либо onResume()
, если операция возвращается назад к фронту или через onStop()
, если она становится невидимой для пользователя.