앱의 실행/종료 및 Foreground/Background 상태에 있을 때, 시스템이 발생시키는 이벤트에 의해 앱의 상태가 전환되는 과정을 의미한다.
앱의 현재 상태에 따라서 수행할 수 있는 작업과 수행할 수 없는 작업이 결정된다.
예를 들어 foreground 상태에서는 앱이 화면에 표시되고 있고 사용자가 직접 사용하고 있는 상황이므로 CPU를 포함한 시스템 리소스의 우선순위가 높다.
그러나 background 상태에서는 앱이 화면에 표시되고 있는 상황이 아니기 때문에 가능한 적은 작업을 수행해야 한다.
앱의 상태는 총 다섯가지로 구분할 수 있다.
앱이 실행되지 않았거나, 시스템에 의해 종료된 상태이다.
앱이 실행 중이지만 사용자로부터 이벤트를 받을 수 없는 상태이다.
앱이 실행되던 중에 알림, 전화 등으로 인해서 앱을 사용할 수 없는 경우 Inactive 상태로 들어간다.
앱이 실행 중이고 사용자로부터 이벤트를 받을 수 있는 상태
버튼을 누르거나 뒤로 스와이프를 하는 등의 사용자가 앱과 상호작용하는 상태이다.
홈화면으로 나가거나 다른 앱을 실행하여 실질적으로 앱이 동작하지 않는 상태
그렇지만 필요한 코드는 돌아가고 있는 상태이다.
음악을 듣거나 네트워크 서비스, 알림이 오는 경우 등의 적은 작업은 Background 상태에서도 가능하다.
구체적으로 Background
에서도 돌아가는 작업들은
a. 오디오, AirPlay 등의 작업과 Picture in Picture ( pip 동영상 서비스 ) 는 백그라운드 상태에서도 가능하다.
a. 지도 등의 위치를 활용하는 서비스
a. Zoom, 카카오 보이스톡 등의 인터넷을 활용하는 전화 서비스
이 있다.
이 밖에도 Background 상태로 들어가면서 선행되어야하는 작업들이 있다.
앱이 Background 상태로 들어가게 되면 메모리의 확보가 특히 중요하다.
예를 들어 A앱이 Background
상태로 들어가고 B앱이 Foreground
로 올라오게 되면 메모리와 기타 시스템 리소스는 당연히 사용자가 현재 사용중인 B앱의 우선순위가 높아야한다.
따라서 Background 상태로 앱이 들어가면 공유 리소스를 해제하여 가능한 적은 리소스와 메모리를 갖도록 한다.
이때 메모리 확보를 위해 중단하는 항목은 아래와 같다.
Foreground 상태로 진입할때는 다시 재개한다.
앱이 종료되었지만 다시 실행하는 경우 최근 작업을 빠르게 로드하기 위해서 필요한 메모리만 저장되어 있는 상태, Suspended에서는 코드가 따로 돌아가지 않는다.
Background에서 Suspended로의 전환은 개발과정에서는 테스트 할 수 있지만 일반 사용자는 알 수 없다.
Background 상태에서 돌아갈 작업이 없다면 2~3초 뒤에 Suspended 상태로 들어가게 되는데 Suspended 상태의 앱을 실행 하였을때 Background 처럼 실행중이던 상태 그대로 복구하는 것이 아닌 필요한 최소한의 메모리만 저장해놓은 상태로 NotRunning 보다는 빠르게 앱을 실행하게 된다.
또한 Suspended 상태도 앱이 실행을 하지는 않지만 메모리를 저장하고 있기 때문에 어느정도 메모리 공간을 차지한다. 따라서 따라서 메모리 공간이 부족해지면 Suspended 상태의 앱을 시스템에서 자체적으로 종료시키게 된다.
이 앱을 실행하면 NotRunning 상태에서 앱이 실행되는 것이므로 앱을 처음 실행하는 것과 같다.
AppLifeCycle에서 가장 의문이 들었고 심도있게 공부한 부분이다.
SnapShot을 찍는 이유가 처음에는 Background 상태에서의 앱을 다시 불러오기 위한 작업인데 그렇다면 멀티 태스킹 환경에서의 앱 상태는 Background 상태인가 ?
라는 의문에서 출발했던 부분이다.
그렇지만 멀티 태스킹 환경에서 다시 앱을 실행하게 되었을때 기존 Background로 들어가기 전의 상태를 불러오지 못하는 앱들이 있었고 또한 멀티 태스킹 환경의 SnapShot들이 기기의 재부팅에도 유지가 되었기 때문에 더더욱 혼란이 왔었다.
결론은 앞서 나왔던 SnapShot을 보여주는 멀티태스킹 화면은 앱의 상태와는 관계없이 사용자의 인터페이스를 위해 최근 사용했던 앱의 SnapShot을 보여주는 화면이었다.
또한 정확하지는 않지만 추측하기로는 멀티 태스킹 환경에서의 SnapShot들은 보조기억장치에 저장되는 것 같다. 주기억장치에 저장되는 경우에는 기기를 재부팅하면 삭제되기 때문에 ..
따라서 멀티태스킹 화면에는 최근 실행된 앱이라면 그 상태에 상관없이 보여지게 된다.
이렇게 보면 멀티 태스킹 화면에 있는 앱들은 Background, Suspended, NotRunning 중 하나의 상태인 앱이라고 봐도 될 것 같다.
AppDelegate과 SceneDelegate는 다음 포스팅에서 다룰 예정이다.