iOS Application Lifecycle, жизненный цикл iOS приложения
admin Опубликовано Опубликовано в Iron ribbon, Фундаментальные основы 2 комментария Tagged with iOS aplication lifecycle
Жизненный цикл ios приложения — обширная и сложная тема. Но как всегда для наших читателей в этой статье будет изложено максимально понятное и наглядное описание процесса жизненного цикла iOS предложения.
Можно в поисковике набрать iOS Application Lifecycle и вы увидите много диаграмм (сложных и не очень), в которых разобраться без пол-литра не получится. Также будет и рисунок, который представлен выше. Эта диаграмма взята их лекций Stanford University, посвященных разработке iOS приложений
Давайте разбираться что, зачем и почему…
На самом деле, когда пользователь запускает приложение на устройстве, работает в нем, сворачивает в фон, запускает другое приложение, выгружает его из памяти, само приложение посылает сообщения классу appDelegate, в котором можно эти сообщения поймать и обработать. Также следует понимать, что помимо вызовов методов из класса appDelegate, происходит посыл сообщения NSNotificationCenter с соответствующим содержанием для каждого из состояний приложения.
Обработка событий из различных этапов жизненного цикла iOS приложений очень похожа на обработку событий жизненного цикла View Controller. Т.е. нужно понимать в какой момент какой метод вызывается и что в этот момент времени уже «проинициализировалось», — с чем мы можем в данный момент работать.
Сначала приложение не запущенно. Потом пользователь запускает приложение. Оно переходит в состояние в состояние Foreground, в котором приложение становится сначала Iactive — на этом этапе выполняется код программы, но не обрабатываются события интерфейса пользователя (интерфейс не отображается, касания не обрабатываются и. т.п.). Затем переходит в этап Active, в котором выполняется код и обрабатываются все события UI.
Если пользователь запустит другое приложение, то текущее приложение перейдет в состояние Inactive и затем в состояние Background. В этом состоянии коды выполняется ограниченное время, и не обрабатываются события UI. Нужно понимать, что именно в этом состоянии можно заставить приложения получить, допустим, из интернета самые свежие обновления чего либо, и дать их приложению, что бы когда пользователь вернул приложение в
После весьма короткого состояния Background приложение переходит в состояние Suspended. В этом состоянии код не выполняется вовсе и система может убить приложение для освобождения памяти, если оно потребуется.
Теперь о методах AppDelegate, которые вызываются во время работы приложения и перехода из одного состояния в другое.
Успешный запуск приложения
Вызывается метод:
// // proSwift.ru // func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. return true } Также происходит оповещение с именем UIApplicationDidFinishLaunchingNotification
На схеме это стрелка №1
Переключение на другое приложение или нажатие копки «Home».
Обычно на этом этапе приостанавливаются какие-то задачи или ставится на паузу игра. В этом месте мы ставим «на паузу» пользовательский интерфейс.
Вызывается метод:
// // proSwift.ru // func applicationWillResignActive(application: UIApplication) { } Также происходит оповещение с именем UIApplicationWillResignActiveNotification
На схеме это стрелка №3
Приложение перешло в состояние Active
Вызывается метод
// // proSwift. ru // func applicationDidBecomeActive(application: UIApplication) { } Также происходит оповещение с именем UIApplicationDidBecomeActiveNotification
Следует перезапустиь все задачи, которые были поствалены на паузу в пердыдущем состянии, или которые не были запущены вовсе. Если приложение пришло из состояния
На схеме это стрелка №2
Переход в состояние Background
Вызывается метод:
// // proSwift.ru // func applicationDidEnterBackground(application: UIApplication) { } Также происходит оповещение с именем UIApplicationDidEnterBackgroundNotification
Тут нужно сохранять пользовательские данные, или сохранять состояние приложения, чтобы оно запустилось с места остановки.
На схеме это стрелка №5
Переход из Background в состояние Foreground
Вызывается метод
// // proSwift. ru // func applicationWillEnterForeground(application: UIApplication) { } Также происходит оповещение с именем UIApplicationWillEnterForegroundNotification
В этом состояние можно сменить все изменения, сделанные в состоянии Background.
На схеме это стрелка №4
Пользователь закрывает приложение
Вызывается метод:
// // proSwift.ru // func applicationWillTerminate(application: UIApplication) { } Также происходит оповещение с именем UIApplicationWillTerminateNotification
Понимание жизненных циклов вью SwiftUI / Хабр
Оле Бегеманн, 15 декабря 2022 г.
Я написал приложение под названием SwiftUI View Lifecycle. Приложение позволяет вам наблюдать, как различные конструкции и контейнеры SwiftUI влияют на жизненный цикл вью, включая время жизни его состояния и время вызова onAppear. Код приложения находится на GitHub. Его можно собрать для iOS и macOS.
Дерево вью и дерево рендеринга
Когда мы пишем код SwiftUI, мы строим дерево вью, состоящее из вложенных значений вью. Экземпляры дерева вью эфемерны: SwiftUI постоянно уничтожает и воссоздает (по частям/фрагментарно) дерево вью по мере обработки изменений состояния.
Дерево вью служит светокопией, из которого SwiftUI создает второе дерево, которое представляет «объекты» фактического вью, который находится «на экране» в любой момент времени («объекты» могут быть объектами фактического UIView или NSView, а также другими представлениями; точное значение «на экране» может варьироваться в зависимости от контекста). Крис Эйдхоф любит называть это второе дерево деревом рендеринга (ссылка указывает на 3-минутное видео, где Крис демонстрирует эту двойственность, настоятельно рекомендуется).
Дерево рендеринга сохраняется при изменении состояния и используется SwiftUI для определения идентичности вью. Когда изменение состояния приводит к изменению значения вью, SwiftUI находит соответствующий объект вью в дереве рендеринга и обновляет его на месте, а не воссоздает новый объект вью с нуля. Это безусловный ключ, делающий SwiftUI эффективным, но у дерева рендеринга есть еще одна важная функция: оно контролирует время жизни вью и их состояние.
Жизненные циклы и состояние вью
Мы можем определить время жизни вью как промежуток времени, в течение которого оно существует в дереве рендеринга. Время жизни начинается с вставки в дерево рендеринга и заканчивается удалением. Важно отметить, что время жизни распространяется на состояние вью, определенное с помощью @State и @StateObject: когда вью удаляется из дерева рендеринга, его состояние теряется; когда вью будет снова вставлено позже, состояние будет воссоздано с его начальным значением.
Приложение SwiftUI View Lifecycle отслеживает три события жизненного цикла вью и отображает их в виде меток времени:
@State = когда было создано состояние вью (эквивалентно началу жизни вью)
onAppear = когда onAppear последний раз вызывался
onDisappear = когда onDisappear последний раз вызывался
Приложение позволяет наблюдать эти события в различных контекстах. Просматривая примеры, вы заметите, что время этих событий меняется в зависимости от контекста, в который встроено вью. Например:
Оператор if/else создает и уничтожает свои дочерние вью каждый раз, когда изменяется условие; состояние не сохраняется.
ScrollView с готовностью вставляет все свои дочерние элементы в дерево рендеринга, независимо от того, находятся они внутри области просмотра или нет. Все дочерние элементы появляются сразу и никогда не исчезают.
List с динамическим содержимым (с использованием ForEach) лениво вставляет только видимые в данный момент дочерние представления. Но как только время существования дочернего представления началось, список сохранит свое состояние, даже если он снова прокручивается за пределы экрана. onAppear и onDisappear вызываются повторно, когда представления прокручиваются в область просмотра и из нее.
NavigationStack вызывает onAppear и onDisappear как только вью отправлены и “всхлопнуты”. Состояние родительских уровней в стеке сохраняется при отправке дочернего вью.
TabView запускает жизненный цикл всех дочерних вью немедленно, даже невидимых вкладок. onAppear и onDisappear вызываются повторно, когда пользователь переключает вкладки, но вью вкладки поддерживает состояние для всех вкладок.
Уроки
Вот несколько уроков, которые можно из этого извлечь:
Различные вью контейнеров могут иметь различное поведение производительности и использования памяти, в зависимости от того, как долго они поддерживают дочерние вью.
onAppear не обязательно вызывается при создании состояния. Это может произойти позже (но никогда раньше).
onAppear можно вызывать несколько раз в некоторых вью контейнеров. Если вам нужно, чтобы побочный эффект возникал ровно один раз за время существования вью, подумайте о том, чтобы написать себе хелпер onFirstAppear, как показано Иэном Кином и Джорданом Морганом в книге «Запуск кода только один раз в SwiftUI» (01. 11.2022).
Я уверен, что вы найдете больше интересных вкусняшек, когда поиграете с приложением. Обратная связь приветствуется!
Жизненный цикл приложения в iOS. Что такое жизненный цикл приложения? | by Manasa MP
- Жизненный цикл приложения представляет собой последовательность событий, происходящих между запуском и закрытием приложения.
- Это очень важно понять всем разработчикам iOS, которым нужен удобный пользовательский интерфейс.
Шаги от перезагрузки устройства до запуска приложения: —
- Когда пользователь включает телефон, никакие приложения не работают, кроме приложений, принадлежащих ОС. Когда пользователь нажимает на значок вашего приложения, SpringBoard запускает ваше приложение.
SpringBoard — это стандартное приложение для управления домашним экраном iPhone. Другие задачи включают в себя запуск WindowServer, запуск и загрузку приложений, а также настройку некоторых параметров устройства при запуске
- Пока Springboard анимирует экран запуска вашего приложения, ваше приложение и необходимые общие библиотеки будут загружены в память. В конце концов ваше приложение начинает выполняться, и делегат приложения получает уведомления.
AppDelegate — это объект делегата приложения. Он наследует класс UIResponder и реализует протокол делегата UIApplicationDelegate
- Основная запись в приложениях iOS — UIApplicationDelegate . Это — это протокол, и вам необходимо внедрить его в свое приложение, чтобы получать уведомления о пользовательских событиях, таких как запуск приложения, переход приложения в фоновый или активный режим, завершение работы приложения, открытие push-уведомления и т. д.
- Класс UIResponder make AppDelegate имеет возможность реагировать на пользовательские события, а UIApplicationDelegate позволяет AppDelegate быть объектом делегата приложения для управления жизненным циклом приложения и реагирования на него.
Состояния выполнения для приложений: —
- Не работает состояние : Приложение не было запущено или завершено системой.
- Неактивно состояние : Приложение переходит в состояние переднего плана, но не получает события.
- Активно состояние : Приложение переходит в состояние переднего плана и может обрабатывать события.
- Фон состояние : В этом состоянии, если есть исполняемый код, он будет выполняться, а если исполняемый код отсутствует или выполнение завершено, приложение будет немедленно приостановлено.
- Приостановлено состояние : Приложение находится в фоновом режиме (в памяти), но не выполняет код, и если в системе недостаточно памяти, оно завершит работу приложения.
Сопоставление состояний приложения с кодом: —
Поток жизненного цикла приложения от запуска до приостановленного состояния: —
Основной цикл выполнения:
- Основной цикл выполнения приложения обрабатывает все события, связанные с пользователем.
- Делегат приложения настраивает основной цикл выполнения во время запуска и использует его для обработки событий и обработки обновлений интерфейсов на основе представлений.
- основной цикл выполнения выполняется в основном потоке приложения
- основной поток является последовательным потоком, и это гарантирует, что связанные с пользователем события обрабатываются последовательно в том порядке, в котором они были получены.
Интервью Вопросы о жизненном цикле приложения: —
- Как фоновое приложение iOS возобновляет работу на переднем плане?
Когда пользователь запускает приложение, которое в данный момент находится в фоновом режиме, система переводит приложение в неактивное состояние, а затем в активное.
2. Какие шаги необходимо предпринять, чтобы приложение перешло на передний план после перезагрузки устройства?
Когда пользователь запускает приложение в первый раз или после перезагрузки устройства или после завершения работы приложения системой, система переводит приложение в активное состояние.
3. Какие шаги необходимо выполнить, когда приложение перемещается с переднего плана на фон?
4. Как отключить выполнение в фоновом режиме?
- Вы можете явно отказаться от фонового выполнения, добавив
Ключ UIApplicationExitsOnSuspend
к файлу приложенияInfo.plist
и установка его значения наYES
. - При отказе от фонового состояния жизненные циклы приложения будут находиться между состояниями «не работает», «неактивно» и «активно» и никогда не перейдут в фоновое или приостановленное состояние.
5. В каком состоянии находится приложение после перезагрузки устройства?
Ответ: Не выполняется.
6. Когда приложение работает, но не получает событие. В каком состоянии находится приложение?
Ответ: Неактивное состояние.
7. Как приложение iOS реагирует на прерывания, такие как SMS, входящий вызов, календарь и т. д.?
Приложение временно переходит в неактивное состояние и остается в этом состоянии до тех пор, пока пользователь не решит, принять или игнорировать прерывание.
- Если пользователь игнорирует прерывание, приложение повторно активируется.
- Если пользователь принимает прерывание, приложение переходит в приостановленное состояние.
8. Для чего используется фоновое состояние?
- Дает возможность сохранить любые данные приложения, что поможет пользователю перезапустить приложение с того места, где он остановился.
- Приложение освобождает любые ресурсы, которые не нужны.
9. Как вы можете добавить дополнительное время фонового выполнения для вашего приложения?
- Приложение может оставаться в фоновом режиме в течение нескольких секунд, и вы можете выполнить любой код в течение этого времени.
- Вы можете позвонить
beginBackgroundTask(expirationHandler handler: (() -> Void)? = nil)
метод, который запрашивает дополнительное время фонового выполнения для вашего приложения метод
10. Как проверить максимальное количество времени, доступное для приложения в фоновом режиме
backgroundTimeRemaining
помогает получить максимальное количество времени, оставшееся для работы приложения в фоновом режиме.
Значение допустимо только после того, как приложение перейдет в фоновый режим и запустит хотя бы одну задачу с использованием beginBackgroundTask(expirationHandler:)
на переднем плане.
11. Как можно отладить фоновую задачу?
beginBackgroundTask(withName:expirationHandler:)
для отладки фоновой задачи.
Я надеюсь, что приведенный выше учебник поможет прояснить концепции жизненного цикла приложения. Пожалуйста нажмите кнопку аплодисментов ниже 👏, чтобы помочь другим найти его!. следуйте за мной на Medium .
Жизненный цикл приложения iOS.
Во время запуска UIApplicationMain… | by Xiao JiangВо время запуска функция UIApplicationMain устанавливает несколько ключевых объектов и запускает приложение. В основе каждого приложения для iOS лежит объект UIApplication, задачей которого является обеспечение взаимодействия между системой и другими объектами в приложении.
Объект UIApplication
управляет циклом обработки событий и другим высокоуровневым поведением приложения. Он также сообщает о ключевых переходах приложения и некоторых особых событиях (например, о входящих push-уведомлениях) своему делегату, который является определяемым вами настраиваемым объектом. Используйте объект UIApplication
как есть, то есть без создания подклассов.
Делегат приложения — это сердце вашего пользовательского кода. Этот объект работает в паре с объектом UIApplication для обработки инициализации приложения, переходов между состояниями и многих высокоуровневых событий приложения. Этот объект также является единственным гарантированно присутствующим в каждом приложении, поэтому он часто используется для настройки исходных структур данных приложения.
Основной цикл выполнения
Основной цикл выполнения приложения обрабатывает все события, связанные с пользователем. Объект UIApplication
устанавливает основной цикл выполнения во время запуска и использует его для обработки событий и обработки обновлений интерфейсов на основе представлений. Как следует из названия, основной цикл выполнения выполняется в основном потоке приложения. Такое поведение гарантирует, что связанные с пользователем события обрабатываются последовательно в том порядке, в котором они были получены.
События ставятся в очередь внутри приложения и отправляются одно за другим в основной цикл выполнения для выполнения. Объект UIApplication
— это первый объект, который получает событие и принимает решение о том, что необходимо сделать. Событие касания обычно отправляется объекту главного окна, который, в свою очередь, отправляет его в представление, в котором произошло касание.
Состояния выполнения для приложений
Не запущено Приложение не запущено или выполнялось, но было остановлено системой.
Неактивно Приложение работает на переднем плане, но в настоящее время не получает события. (Однако это может быть выполнение другого кода.) Приложение обычно остается в этом состоянии ненадолго, когда оно переходит в другое состояние.
Активно Приложение работает на переднем плане и получает события. Это нормальный режим для приложений переднего плана.
Фон Приложение находится в фоновом режиме и выполняет код. Большинство приложений ненадолго переходят в это состояние на пути к приостановке. Однако приложение, которое запрашивает дополнительное время выполнения, может оставаться в этом состоянии в течение определенного периода времени.