Різниця між onStart () та onResume ()


176

Я не можу отримати значення onStart()перехідного стану. onResume()Метод завжди викликається після onStart(). Чому це не може бути onResume()викликано після, onRestart()а onCreate()методи виключені onStart()? Яке його призначення?

Чому ми не можемо жити без onStart(). Я все ще вважаю це зайвим (можливо, тому, що не розумію його значення повністю).


Знайдіть тут життєвий цикл програми: d.android.com/guide/topics/fundamentals.html
ykatchou

Цей матеріал простий. Спробуйте пояснити це за допомогою фрагментів, тепер це для Android програмування!
Скотт Біггс

Відповіді нижче не мають фактичного коду з поясненнями. Це код, який пояснює його фрагментом.
Атул

Відповіді:


306

Чому не можна викликати 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().


Це означає, що обидва onCreate()і onRestart()матимуть багато спільного коду, правда?
Dheeraj Vepakomma

1
@Dheeraj: Ні, не обов'язково. Це псевдокод і мав на меті просто проілюструвати, як Activityможе використовуватися кожен етап життєвого циклу. Етап створення onCreate(...)цілком може зробити багато, коли мова йде про екземпляри членів екземпляра (елементи інтерфейсу тощо), але для 'перезавантаження' цього робити не потрібно. Насправді багатьом Activitiesнасправді не потрібно реалізовувати більше onCreate(...), onResume()а onPause()інші методи доступні для випадків, коли вам може знадобитися робити інші речі, а головне - зрозуміти, куди потрібно поставити код.
Скуонк

1
Ось чому я ненавиджу API Android порівняно з iOS і навіть WP7 ... Я робив гру, яка працює на всіх трьох в C #, і я мушу сказати, що дуже розчарований у Google та Android. Здається, їх не вистачає у відділі дизайну мови / API. Я сподіваюся, що якась інша операційна система Linux
перейме

2
@Tim: Гаразд, придумайте кращий дизайн. Як би ви попрацювали зі сценарієм мобільного телефону, коли хтось використовує додаток (ваш додаток), і вони раптом отримують телефонний дзвінок? Дизайнер додатків прямо не називає Activityметоди життєвого циклу - це ОС Android, яка робить це, і це робить це дуже ефективно (якщо припустити, що розробник програми знає, що вони роблять, а також кодує ефективно). Якщо ви багато займаєтесь розробкою Android, то зрозумієте, чому все працює так, як вони - це не на 100% ідеально, але це досить добре.
Скуонк

9
Я думаю, що відповідь Нілеша нижче є набагато зрозумілішою. Ключова відмінність між onStartі onResumeполягає у «видимості» та «взаємодії з користувачем». Ця метафора водіння автомобіля є заплутаною та не дуже корисною.
KJ

142

Коротка відповідь:

Ми не можемо жити без 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


4
Коли я пояснюю це студентам, я використовую можливоOnInvisible () замість onStop (). І використовуйте можливоOnDestroy () замість onDestroy (). Ці назви добре працюють, як я знаходжу пояснення. Думаю, я не хочу, щоб Google насправді змінив ці назви.
Стефан Бранчик

Я як ваші пропонованих імена, вони допомагають зробити якийсь - то сенс цієї частини смішний API Android. У мене все ще є питання загалом щодо життєвого циклу. На всіх діаграмах видно, що існує шлях від onPause безпосередньо до onResume. Я не думаю, що я ніколи не бачив, щоб цей шлях насправді йшов у будь-яких випадках. Він завжди проходить шлях від onStop до onStart. Що спричинило б інший шлях?
Дьюї Возел

@StephanBranczyk, чому ти використовуєш, можливо, ... ()? Чому "можливо"?
Marian Paździoch

1
@Damnum, Для останнього пояснення життєвого циклу активності пропоную переглянути проміжний курс Android Udacity, створений Google. Це безкоштовно, якщо припустити, що ви натискаєте на синю кнопку, щоб безкоштовно отримати доступ до її матеріалів, а не пробну кнопку (ні кнопку нанодегрі). udacity.com/course/developing-android-apps--ud853
Стефан Бранчик

1
@Damnum, я б запропонував вам задати це питання на форумі udacity, що стосується переглянутого відео. Але в основному, я думаю, це залежить від діалогу, який використовується, чи це діалогова діяльність, чи лише діалог.
Стефан Бранчик

29

onStart() викликається, коли діяльність стає видимою для користувача. onResume()називається, коли активність почне взаємодіяти з користувачем. Ви можете захотіти робити різні справи в цих випадках.

Дивіться це посилання для довідок.



10

Книга "Привіт, Android, представлення платформи мобільного розвитку Google" дає приємне пояснення життєвого циклу додатків для Android. На щастя, у них є окремий розділ в Інтернеті як уривок. Дивіться графіку на сторінці 39 в http://media.pragprog.com/titles/eband3/concepts.pdf

До речі, ця книга настійно рекомендується для андроїд-початківців!


2
Хороший образ і хороша книга, але все ще не дає відповіді, чому нам насправді потрібен метод onStart () і які особливі речі ми можемо в ньому зробити, ми не можемо зробити в onResume ().
Євген

8
onStart () НЕ називається, якщо додаток було призупинено. Ваш додаток "призупиняється", якщо інший додає фокус, але НЕ закриває його повністю. Таким чином, ви можете робити інші речі в "призупиненому" стані, ніж ви робили б у "Зупиненому" стані. Таким чином, ви можете робити різні речі, якщо ваш додаток просто "відновлено" із стану призупиненого стану, ніж ви зробили б, якщо ваш додаток "запускається" із зупиненого стану або з повного запуску. Чи допомагає це?
Мартін Бука Везер

7

Особливо відвертий приклад - коли ви вирішили показати керований діалог із діяльності, використовуючи showDialog(). Якщо користувач обертає екран, поки діалогове вікно ще відкрите (ми називаємо це "зміною конфігурації"), то основна активність буде проходити всі виклики закінчуваного життєвого циклу до тих пір onDestroy(), буде відтворена та повернеться вгору через життєві цикли. Що ви, можливо, не чекаєте, це те, що onCreateDialog()і onPrepareDialog()(методи, які викликаються коли ви робите, showDialog()а тепер знову автоматично відтворюєте діалогове вікно - автоматично, оскільки це керований діалог), викликаються між onStart() і onResume(). Тут є те, що діалогове вікно не охоплює весь екран і тому залишає видимою частину основної діяльності. Це деталь, але це має значення!


7

onStart()

  1. Викликається після onCreate (Bundle) або після onRestart (), а потім onResume () .
  2. ви можете зареєструвати BroadcastReceiver в onStart() щоб стежити за змінами, які впливають на ваш інтерфейс користувача, вам потрібно скасувати реєстрацію в onStop ()
  3. Отримані класи повинні викликати реалізацію цього методу суперкласом. Якщо їх не буде, буде викинуто виняток.

onResume()

  1. Викликається після onRestoreInstanceState (Bundle), onRestart () або onPause ()
  2. Почніть анімацію, відкрийте пристрої ексклюзивного доступу (наприклад, камери)

onStart() зазвичай відправляють роботу на фоновий потік, значенням якого є:

  • START_STICKY, щоб автоматично перезапустити, якщо він загинув, щоб тримати його активним.

  • START_REDELIVER_INTENT для автоматичного перезапуску та повторного спроби, якщо сервіс був убитий перед stopSelf ().

onResume()ОС викликає операційну систему після сну або після сповіщення або іншої часткової екранізації дитини, що залишає частину попереднього вікна видимим, тому необхідний метод повторної ініціалізації полів (у структурі спробу з урахуванням винятків ). Така ситуація не викликає onStop()покликання, коли дитина закривається.

onResume()називається без, onStart()коли активність поновлюється з фону

Докладніше можна відвідати Android_activity_lifecycle_gotcha та життєвий цикл діяльності


насправді я потрапляю на зупинку, коли моє додаток переходить на
другий

5

Сподіваємось, просте пояснення: -

onStart () -> викликається, коли активність стає видимою, але може бути не на передньому плані (наприклад, AlertFragment знаходиться зверху або будь-який інший можливий випадок використання).

onResume () -> викликається, коли активність на передньому плані, або користувач може взаємодіяти з Активністю.


4

onStart()означає, що Activityвведено у видимий стан та макет створено, але не може взаємодіяти з цим макетом діяльності.

Resume() означає, що тепер ви можете взаємодіяти з макетом діяльності.


1

Зауважте, що між дзвінками до OnStart () та onResume () трапляються речі. А саме onNewIntent (), про який я болісно з’ясував.

Якщо ви використовуєте прапор SINGLE_TOP, і ви надсилаєте деякі дані до своєї діяльності, використовуючи додаткові наміри, ви зможете отримати доступ до них лише в onNewIntent (), який викликається після onStart () і перед onResume (). Тому зазвичай ви візьмете нові (можливо лише модифіковані) дані з додаткових даних і встановите їх деяким членам класу, або використовуйте setIntent () для встановлення нового наміру як вихідного наміру діяльності та обробляйте дані в onResume ().


0

Посилання на http://developer.android.com/training/basics/activity-lifecycle/starting.html

onResume()Викликається безпосередньо перед початком дії взаємодії з користувачем. На даний момент активність знаходиться у верхній частині стека діяльності, і ввід користувача буде переходити до неї. Завжди за ним onPause().

onPause()Викликається, коли система збирається розпочати відновлення іншої діяльності. Цей метод зазвичай використовується для внесення незбережених змін до постійних даних, зупинки анімації та інших речей, які можуть споживати процесор тощо. Він повинен робити все, що робить дуже швидко, оскільки наступна діяльність не буде відновлена, поки вона не повернеться. Далі слід або onResume()якщо діяльність повернеться на фронт, або onStop()якщо вона стане невидимою для користувача.


0

Не впевнений, чи вважається це відповіддю - але ось YouTube Video from the Course від Google (Розвиток програм для Android за допомогою Котліна), який пояснює різницю.

  • При запуску викликається, коли активність стає видимою
  • Функція "Пауза" викликається, коли активність втрачає фокус (як з'являється діалогове вікно)
  • On Resume викликається, коли активність набуває фокус (наприклад, коли діалогове вікно зникає)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.