Разница между 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(), когда действие начнет взаимодействовать с пользователем. В этом случае вы можете делать разные вещи.

См. эту ссылку для справки.

Ответ 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(), если она становится невидимой для пользователя.