개발/Android

[안드로이드] 생명주기(LifeCycle)

Eun 2021. 5. 27. 21:55

이번 포스트는 안드로이드 생명주기에 대해 간단하게 정리해볼 예정이다.

 

 

 

생명주기에 관한 이해

공부하기 앞서, 생명주기에 관한 이해부터 하고 넘어가자

 

사용자가 앱을 탐색하고 앱에서 나가고 앱으로 다시 돌아가면 앱의 Activity 인스턴스는 생명주기 안에서 서로 다른 상태로 전환된다.

Activity클래스는 활동이 상태 변화를 알아차릴 수 있는 여러 콜백(6개 함수)을 제공한다.

 

사용자가 활동을 벗어났다가 다시 돌아왔을 때 콜백 메서드에서 선언할 수 있다.

예를 들어 스트리밍 동영상을 빌드하다 사용자가 다른 앱으로 전환할 때 동영상을 일시중지하고 네트워크 연결을 종료할 수 있다.

그리고 사용자가 다시 돌아왔을 때 네트워크 연결을 다시 하고 사용자가 일시중지한 시점에서 동영상을 다시 시작하도록 한다.

이 모든 것은 콜백으로 인해 상태변화를 알아차려 특정 작업을 실행할 수 있도록 한다. 적시에 알맞은 작업을 하고 적절한 작업을 하면 앱을 더욱 안정적으로 기능할 수 있다.

 

콜백을 잘 구현하면 다음과 같은 문제를 예방할 수 있다.

  • 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
  • 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
  • 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
  • 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제

밑에 생명주기에 대해 잘 알아두고 앱을 안정적이게 구동할 수 있도록 하자

 1. Oncreate()

생성자랑 비슷하다. 처음에 액티비티가 생성되었을 때  호출된다. 

일반적인 정적 설정(뷰 생성, 데이터 바인딩)을 설정한다.

 

2. OnStart()

액티비티가 사용자에게 표시되기 직전에 호출된다.

OnCreate()와 OnResume() 사이 순서에 있다.

 

3. OnResume()

OnStart()와 비슷한데 액티비티가 뜨고 동작하기 완전 직전에 실행된다.

OnStart()보다 액티비티가 실행되기 더 직전에 가깝다.

 

4. OnPause()

OnPause()부터는 액티비티가 실행상태인 이후의 생명주기이다. 

액티비티(현재화면)를 다가리지 않을 때 호출이 되는데,

예를 들면 중간크기의 다이얼로그 같은 화면이 떴을 때 OnPause()가 호출이 된다. 사용자가 다시 복귀하면 onResume()가 호출된다.

그리고 만약 해당 앱을 종료하거나 현재 액티비티(화면)이 다른 화면에 의해 완전히 가려져 안보이게 되는 백그라운드 상태 등은 onStop()이나 onDestory()까지 차례로 호출된다. 

간단히 말하면,

 

  • 현재화면 액티비티가 아직 완전히 가려지지 않으면 onPause()
  • 다른 액티비티가 위로 올라오면서 현재화면이 다 가려지면(원래 액티비티가 백그라운드에 있는 경우) onPause() → onStop() ⇨ 다시 복구되면 onRestart() → onStart()
  • 아예 종료되거나 뒤로가기 등으로 없어지면 onPause() → onStop() → onDestroy()

위와 같이 진행된다고 보면 된다. 사진을 같이 보면 이해하기 더 쉽다.

 

그리고 onPause()는 데이터를 저장하는데 주로 사용된다.

예를 들어 게임을 하다가 중간에 전화가 오는 경우 전화를 끊고 게임을 시작하면 원래 하던 곳부터 계속 진행되었던 경험이 있을 것이다.

이런 경우 onPause()에서 현재의 데이터들을 sharedpreferences를 사용해 onPause()에 저장해놓으면 다시 앱을 실행하였을 때 onResume()에 저장한 데이터들을 복원해 진행시킬 수 있다.

 

5. OnStop()

우리가 쓰던 액티비티가 완전히 뒤로가서 안보일 때 호출되는 메소드이다.

하지만 만약 OnStop()인 상태인데 앱을 다시 켰을 경우 OnRestart()를 거쳐 OnStart() 생명주기로 다시 돌아간다.

즉, onStop()은 아직 액티비티가 소멸된 상태는 아니라는 것!

 

아래 예시를 보면서 좀 더 정확히 이해해보자

 

1. 액티비티를 사용하다 홈버튼을 눌렀을 경우

onPause()와 onStop()가 순서대로 호출된다. 앞서 말한듯이 액티비티는 아직 소멸된 상태는 아니므로 다시 앱을 키면 onRestart()와 onStart()가 호출된다.

 

2. 뒤로가기로 앱을 종료했을 경우

onPause()→onStop()→onDestroy 순서로 호출되고 다시 앱을 실행하면 onCreate()부터 호출된다.

 

6. OnDestroy()

액티비티를 더이상 쓰지 않을 경우 즉, 액티비티를 소멸되기 전에 호출된다. 이 이후에 다시 실행시키면 onCreate()부터 실행된다.

 


참고