'Active는 앱이 활성화될 때를 말하는 것 같은데, InActive는 뭐지..'
'Suspend? Running? Foreground, Background는 뭐야.. ㅠ'
'어휴 내가 다 모르는 것뿐이네..'
이런 생각이 들었다면 걱정하지 마라. 모르는 걸 알기 위해서 여기에 들어온 걸 테니! 필자도 잘 몰랐다. 같이 뽀개자!
이 둘의 공통점은 앱이 메모리에 올라가 있다는 것이다. 차이점은 Foreground 일 때는 앱이 화면을 점유하고 있고, Background 일 때는 앱이 화면을 점유하고 있지 않다는 것이다.
즉, Foreground는 앱의 화면이 보이는 상태에서 메모리에 올라간 것이고, Background는 앱의 화면이 보이지 않는 상태에서 메모리에 올라가있는 것이다.
앱 아이콘을 클릭해서 앱으로 들어갈 때 앱은 Active 상태로 들어간다. 중요한 점은 Active 상태는 InActive가 감싸고 있다. 즉, Active 상태로 들어가거나 나갈 때 무조건 InActive를 거쳐야 한다는 것이다.
마치 InActive는 성벽, Active는 성벽 안과 같다.
그럼 앱이 Active에서 InActive가 되는 순간은 언제일까?
앱 사용 중에 문자 메시지 또는 전화가 올 때.
사용자가 직접 홈 버튼을 두 번 누르거나 아래에서 끌어올려서 App Switcher로 갔을 때.
즉, 현재 사용 중이던 앱을 사용자가 full control 할 수 없을 때가 InActive다.
그럼 이제 InActive에서 갈 수 있는 갈래는 두 가지다. 다시 Active 상태로 돌아가거나 Background 모드로 들어간다. 만약, 앱을 사용하다가 문자가 왔는데 그 문자에 반응을 한다? 그럼 Background 모드로 들어가는 것이다.
보통의 경우 Background 모드에서 앱은 Suspend인 상태다. 그냥 아무 일도 안 하고 가만히 기다리는 것이다. 하지만 몇몇 경우는 Background에서 Running을 할 때도 있다.
예를 들면, 앱에서 이메일 보내기를 누르고 바로 앱을 꺼버리면 앱은 Background 모드로 들어갔지만 이메일을 보내야 한다. 또, 앱에서 타이머를 돌리고 끄면 Background에서 타이머가 계속 돌아가야 한다.
Background Running에 대해 좀 더 얘기해 보자면 iOS는 보안이 강한 만큼 Background에서 마음껏 돌아갈 수 있는 앱은 애플이 만든 앱 말곤 없다. 그래서 우리가 만든 앱은 Background Running이 제한적이다.
잠깐! 그럼 만약에 Background Running 제한 시간을 넘기면 어떻게 될까? Time Out으로 Not Running 상태가 된다. 위험한 앱으로 인지해서 메모리에서 앱을 내리고 아예 꺼버리는 것이다.
반대로 Background Running 제한 시간을 잘 지키면 Suspend 모드로 들어가는데, 대신 자기를 안 부르고 다른 앱을 불러 사용 중이라면 메모리가 부족해질 것이다. 메모리가 부족해지면 Suspend 앱이 Not Running 상태가 돼서 메모리에서 내려가고 아예 종료된다.
이 부분은 오직 OS가 판단하는 부분이다.
그럼 AppDelegate 메서드와 함께 살펴보자. 제일 먼저 앱 아이콘을 클릭해서 앱을 실행하면 DidFinishLaunchingWithOptions 메서드가 호출되고 applicationDidBecomeActive가 호출된다.
그렇게 앱을 사용하다가 InActive 상태로 들어가면 applicationWiiResignActive 메서드가 호출된다.
그리고 다시 Active로 가면 applicationDidBecomeActive 메서드가 호출된다.
하지만 Background로 가면 applicationDidEnterBackground가 호출된다.
여기서 Suspend가 아닌 Background Running이 된다면 applicationWillEnterForeground가 호출된다.
그리고 Timeout이나 메모리 부족으로 앱이 종료될 때 applicationWillTerminate가 호출된다.
💙 참고한 영상
https://youtu.be/7GlwS2lOKbE